첫 Opensearch
쿼리 성공 후 속전속결로 API 제작이 끝나자 자신감이 넘치기 시작했습니다.
Spring Cloud
제품을 쓰라는 요구사항이 있었기 때문에 사이드 프로젝트를 기획
하며 연습해둔 얄팍한 MSA 구축
지식을 써보고 싶은 마음도 커지고 있었죠..
그래! 어차피 과제인데 실험 정신
이 중요
한거야!
라는 정신 승리 버프
와 함께 바뀌고 바뀌어 현재 아키텍처
가 탄생
하게 되었습니다.
꽤나 많은 Spring Cloud
제품들을 사용하게 되었는데, 이것들에 대해서 간단히 정리하는 시간으로 이번 게시글을 다뤄볼까 합니다.
Spring Cloud Eureka
는 MSA
에서 충족시켜야 할 패턴인 Service Discovery 패턴과 연관있는 제품입니다.
MSA
와 같이 복잡한 분산 시스템을 가지고 있는 경우, 대부분 서비스는 원격 호출
로 구성되게 됩니다.
원격 서비스 호출은 IP 주소
와 포트
를 이용하는 경우가 많습니다.
클라우드 네이티브 환경에서 개발을 하면서 Auto-Scaling
이나 Self-Recovery
등 다양한 이유로 동적으로 IP가 변경되는 일이 많아졌습니다.
즉, 애플리케이션 코드
나 설정 파일(yml 등)
에 호출할 서비스의 IP
또는 포트
를 작성해 두는 것으로는 동적으로 변경된 IP 주소
를 알아낼 방법이 없다는 의미이기도 합니다.
Spring Cloud
에서 이런 서비스 디스커버리 역할을 해주는 제품 중 하나가 Spring Cloud Eureka
입니다.
Eureka는 Eureka Server
와 Eureka Client
로 구분할 수 있습니다.
Eureka Server
는 서비스 레지스트리 역할을 하는 서버 그 자체라고 할 수 있고,
모든 마이크로 서비스는 Eureka Sever
에 등록되기에 Eureka Client
라고 할 수 있습니다.
Eureka의 주된 역할은 Eureka에 등록된 서비스의 Heartbeats를 설정한 주기에 따라 주기적으로 확인하고, 응답이 오지 않는 서비스는 제거합니다.
대부분 API Gateway 패턴
과 같이 쓰이기 때문에, API Gateway
에서 Eureka
에 등록된 서비스 이름을 기반으로 라우팅하는 용도로도 사용합니다.
Eureka
는 서비스의 인스턴스 ID
, IP
, PORT
정보를 Local Cache
에 등록하여 관리하게 됩니다.
SCG(Spring Cloud Gateway)
에 대해서 보기 전에, API Gateway에 대해서 먼저 알아보겠습니다.
API Gateway
는 Reverse Proxy
와 닮은 점이 많습니다.
요청이 들어오면 어디로 가야하는지 라우팅
해줄 수 있고, 가장 앞단에 있기 때문에 들어오는 요청의 내용을 로깅하고 보안을 위한 인증 & 인가
작업을 해줄 수 있습니다.
MSA에서 인증 & 인가
를 API Gateway
한 곳에서 책임지지 않고 서비스마다 그 책임을 부여한다면 인증과 인가
는 공통 관심사인데 스프링의 핵심 개념인 AOP
와도 맞지 않아 패러다임 불일치
를 가져가게 됩니다.
Spring Cloud Gateway
는 Netty
를 이용한 비동기 처리를 이용해 높은 성능을 자랑하는 Spring Cloud
의 표준 API Gateway
입니다.
모든 사용자는 API Gateway
를 통해 요청을 수행하게 되고, API Gateway
는 Predicates
를 활용해 다양한 규칙을 설정하고 각 규칙마다 필터를 추가
하거나 부가 작업
을 할 수 있도록 지원하고 있습니다.
저는 이번 프로젝트에서 API Gateway
를 통과하는 모든 요청에 대해 DB에 저장하는 로직을 LoggingFilter
를 통해 수행하도록 했습니다.
사용자는 API Gateway
를 통해 요청을 보내게 되고, API Gateway
는 요청 Path
와 맞는 Predicate
를 찾아 올바른 서비스에 라우팅하게 됩니다.
Spring Cloud Config
는 분산 시스템에서 설정 정보(application.yml)
를 외부에 보관할 수 있도록 지원해주는 서비스입니다.
Spring Cloud Config
를 이용하면 여러가지 장점을 얻을 수 있습니다.
중앙 서버에서 관리
할 수 있다.설정 파일
의 변경사항을 반영
할 수 있습니다.Spring Cloud Config Server
는 여러가지 방법으로 설정 파일을 외부에서 관리할 수 있는데, 로컬 Git 저장소
나 파일 시스템
또는 원격 Git 저장소
등을 이용할 수 있습니다.
보통은 원격 private git repository
에 ssh
를 이용해 접근하는 것이 일반적입니다.
Spring Cloud Config Server
는 민감한 정보 보호를 위해서 암호화와 복호화 기능을 제공합니다.
private git repository
에는 암호화된 설정 정보를 업로드하여, 탈취되었을때 의미 없는 정보를 주도록 유도하고 애플리케이션
에 필요한 설정 정보들은 모두 Spring Cloud Config Server가 복호화 하여 평문으로 제공
하게 됩니다.
설정 정보가 변경 되었다면, Spring Actuator
의 refresh API
를 호출해야 변경 사항이 마이크로 서비스에 반영됩니다.
만약 마이크로 서비스가 매우 많은 경우에는 일일히 Actuator
의 refresh API
를 호출하는 것도 부담이 될 수 있고, 실수로 누락할 가능성도 있습니다.
이 문제를 해결하기 위해 Spring Cloud Bus
를 이용합니다.
Spring Cloud Bus의 특징은 아래와 같습니다.
분산 시스템
의 노드를 경량 메시지 브로커와 연결상태
및 구성
에 대한 변경 사항을 연결된 노드에게 전달Spring Cloud Bus
를 이용하면 마이크로 서비스
하나만 busrefresh
를 호출해줘도 다른 서비스들도 변경 사항이 있다면 이벤트가 전파되어 새로운 설정정보를 반영
합니다.
Spring Cloud Config Server
에 요청을 보내서 이벤트를 전파할 수 있도록 Spring Cloud Monitor
도 이용하도록 결정했습니다.
Spring Cloud Monitor
를 활용하면 설정 정보가 변경되었을때 변경을 감지하고 자동으로 반영해주는 역할을 해줄 수 있습니다.
repository
에 웹훅을 걸어두면 설정정보 변경부터 반영까지 완전 자동화 시킬 수 있게 되는 것입니다.
Spring Boot 3.X
버전을 채택하면서 Spring Cloud Sleuth
를 사용하지 못하게 되었습니다.
Spring Boot 3.X
버전 부터는 Micrometer Tracing Bridge Brave
를 이용해야 Zipkin
과 연동할 수 있습니다.
Zipkin
을 활용해 분산된 마이크로 서비스들을 추적
하고 요청이 잘 처리되고 있는지, 각 서비스별로 의존성은 어떻게 구성
되어 있는지를 확인할 수 있습니다.
Zipkin
을 이용해 로그를 ES
와 같은 저장소에 저장할 수 있습니다.
Zipkin
은 분산환경에서 로그 트레이싱
을 위해 트위터에서 개발되었고 가장 활성화된 오픈 소스입니다.
다음 게시글에서는 지금 선택한 제품들을 연동하고, 코드 레벨에서 개선할 수 있는 부분을 개선한 뒤 docker-compose를 이용해 도커라이징 하는 과정을 다뤄보겠습니다.
오늘도 읽어주셔서 감사합니다.
다음 게시글로 이동 -> 인턴의 당돌한 고래사육(a.k.a OJT 프로젝트에 MSA를 태워?) - 최종화
다음 포스트도 기대되네요..!