현대의 소프트웨어 개발에서 마이크로서비스 아키텍처(MSA)는 큰 인기를 끌고 있습니다. 따라서 전통적인 모놀리틱 아키텍처에서 점점 더 많은 기업들이 MSA(Microservices Architecture)로 전환하고 있습니다.
그러나 앞선 "MSA란 무엇일까❓"포스팅에서도 알아보았듯이 많은 장점들이 있지만 복잡한 도전과제를 수반하기 때문에 이를 효율적으로 관리하고, 운영하는 것을 결코 쉬운 일이 아닙니다.
따라서 아키텍처를 효과적으로 운영하려면, 여러 가지 복잡한 문제들을 해결해야 합니다. 이때 도움이 되는 것이 바로 "Spring Cloud"입니다. 이번 포스팅에서는 Spring Cloud가 무엇인지, 어떠한 종류가 있는지, 장단점에 대해서 알아보겠습니다.
Spring Cloud란❓
Spring Cloud는 마이크로서비스 아키텍처(MSA)를 지원하기 위해 다양한 도구와 라이브러리를 제공하는 프레임워크입니다.
Spring Cloud는 Spring Framework를 기반으로 하여, 분산 시스템과 클라우드 환경에서 애플리케이션을 효과적으로 개발하고 운영할 수 있는 다양한 도구와 라이브러리를 제공합니다. 이를 통해 마이크로서비스 간의 통신, 설정 관리, 부하 분산, 서킷 브레이커 등 여러 가지 문제를 해결할 수 있습니다.
Spring Cloud의 주요 기능
- 서비스 등록 및 발견(Service Discovery)
- Eureka
- Consul
- Zookeeper
- 부하 분산(Load Balancing)
- Ribbon
- Spring Cloud LoadBalancer
- 서킷 브레이커 (Circuit Breaker)
- Hystrix
- Resilience4j
- API 게이트웨이 (API Gateway)
- Zuul
- Spring Cloud Gateway
- 구성 관리 (Configuration Management)
- Spring Cloud Config
- 분산 추적 (Distributed Tracing)
- Spring Cloud Sleuth
- Zipkin
- 메시징 (Messaging)
- Spring Cloud Stream
- 서비스 모니터링 및 관리
- Spring Boot Actuator
- Spring Cloud Bus
Spring Cloud의 주요 모듈
서비스 등록 및 발견(Service Discovery)
- Eureka
- Netflix에서 개발한 서비스 디스커버리 서버로, 클라이언트가 서비스 인스턴스를 동적으로 찾을 수 있도록 지원합니다.
- Eureka는 서비스의 등록과 검색을 자동화하여, 애플리케이션의 복잡성을 줄여줍니다.
- 주요 특징
- 서비스 레지스트리 (Service Registry)
- Eureka는 서비스 레지스트리로 작동하여, 모든 서비스 인스턴스의 위치를 중앙 저장소에 저장합니다.
- 각 서비스는 Eureka 서버에 자신의 위치(호스트 및 포트 정보)를 등록하고, 다른 서비스는 Eureka를 통해 이러한 정보를 조회하여 통신할 수 있습니다.
- 헬스 체크(Health Check)
- Eureka는 서비스 인스턴스의 상태를 주기적으로 확인하는 헬스 체크 기능을 제공합니다.
- 서비스 인스턴스는 주기적으로 자신을 등록한 Eureka 서버에 헬스 체크 정보를 보내며, Eureka는 이를 기반으로 서비스의 가용성을 판단합니다.
- 서비스 레지스트리 (Service Registry)
부하 분산(Load Balancing)
- Ribbon
- Neflix가 개발한 Ribbon은 클라이언트 사이드에서 로드 밸런싱을 지원하는 도구로, 서비스 인스턴스 간의 부하를 효과적으로 분산시킬 수 있습니다.
- 주요 특징
- 서버 리스트 제공자(Server List Provider)
- Ribbon은 Eureka와 같은 서비스 디스커버리 서버로부터 서비스 인스턴스의 리스트를 제공받습니다.
- 이를 통해 서비스 인스턴스의 위치와 상태를 동적으로 업데이트하며, 로드 밸런싱에 필요한 최신 정보를 유지합니다.
- 로드밸런싱 알고리즘 (Load Balancing Algorithms)
- Ribbon은 다양한 로드 밸런싱 알고리즘을 지원합니다. 대표적인 알고리즘으로는 라운드 로빈(Round Robin)과 가중치 기반(Weighted) 로드 밸런싱이 있습니다.
- 라운드 로빈은 요청을 순서대로 분산시키며, 가중치 기반 로드 밸런싱은 각 인스턴스의 처리 능력에 따라 트래픽을 분산시킵니다.
- Failover
- Ribbon은 요청 실패 시 자동으로 다른 서비스 인스턴스로 전환하는 Failover 기능을 제공합니다.
- 만약 특정 인스턴스가
응답하지 않거나 오류가 발생하면, Ribbon은 다른 가용 인스턴스를 선택하여 요청을 처리합니다.
- 서버 리스트 제공자(Server List Provider)
서킷 브레이커
- Hystrix
- Hystrix는 넷플릭스가 개발한 서킷 브레이커 라이브러리로, 서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 데 도움을 줍니다.
- 주요 특징
- 서킷 브레이커 상태
- 클로즈드 (closed) : 정상적으로 호출이 진행되고 있으며, 모든 요청이 서비스 인스턴스로 전달됩니다.
- 오픈 (open) : 호출 실패가 일정 기준을 초과하면 서킷이 열려 모든 요청이 즉시 실패하게 됩니다.
- 하프-오픈(Half-Open) : 일정 시간이 지난 후, 서킷이 하프-오픈 상태로 전환되어 일부 요청이 서비스 인스턴스로 전달됩니다.
- Failback
- 호출 실패 시, Hystrix는 대체 로직(서킷 브레이커의 fallback 메커니즘)을 제공하여 시스템의 안정성을 유지합니다.
- 이는 서비스의 응답을 대체하는 로직을 실행함으로써, 장애 발생 시에도 최소한의 기능을 제공할 수 있도록 합니다.
- 모니터링
- Hystrix Dashboard를 통해 서킷 브레이커의 상태와 성능 지표를 시각적으로 모니터링할 수 있습니다.
- 이를 통해 시스템의 상태를 실시간으로 감시하고, 문제를 조기에 발견하여 대응할 수 있습니다.
- 서킷 브레이커 상태
- Resilience4 j
- Resilience4j는 자바 기반의 경량 서킷 브레이커 라이브러리로, 넷플릭스 Hystrix의 대안으로 개발되었습니다.
- 주요 특징
- 서킷 브레이커
- 호출 실패를 감지하고 서킷을 열어 추가적인 호출을 차단하여 시스템의 부하를 줄입니다.
- 실패가 계속될 경우 서킷을 열어, 부하를 분산시키고 시스템의 안정성을 유지합니다.
- Failback
- 호출 실패 시, 대체 로직을 실행하여 시스템의 안정성을 유지합니다.
- Resilience4j는 실패 시 실행할 대체 로직을 설정할 수 있어, 서비스의 복원력을 높이는 데 도움을 줍니다.
- 타임아웃 설정
- 호출의 응답 시간을 설정하여 느린 서비스 호출에 대응할 수 있습니다.
- 타임아웃을 설정함으로써, 응답 시간이 긴 호출로 인해
전체 시스템이 영향을 받지 않도록 방지합니다.
- 재시도
- 재시도 기능을 지원하여 일시적인 네트워크 문제나 서비스 장애에 대응할 수 있습니다.
- 재시도 메커니즘을 통해 일시적인 오류를 극복하고 요청을 성공적으로 처리할 확률을 높입니다.
- 서킷 브레이커
API 게이트웨이
API 게이트웨이는 마이크로서비스 아키텍처에서 클라이언트 요청을 여러 서비스로 라우팅 하고, 공통 기능을 처리하는 중요한 구성 요소입니다. 주요 API 게이트웨이 솔루션으로는 Zuul과 Spring Cloud Gateway가 있습니다.
- Zuul
- 넷플릭스가 개발한 API 게이트웨이로, 모든 서비스 요청을 중앙에서 관리합니다.
- 주요 특징
- 라우팅
- 클라이언트의 요청 URL에 따라 적절한 백엔드 서비스로 요청을 전달합니다.
- 필터
- 요청 전후에 다양한 작업을 수행할 수 있는 필터 체인을 제공합니다.
- 필터를 사용하여 요청의 인증, 권한 부여, 로깅 등을 처리할 수 있습니다.
- 모니터링
- 요청 로그 및 메트릭을 통해 서비스의 상태를 모니터링할 수 있습니다.
- 이를 통해 서비스의 성능을 추적하고 문제를 조기에 감지할 수 있습니다.
- 라우팅
- Cloud Gateway
- Spring Cloud Gateway는 Spring Cloud에서 제공하는 API 게이트웨이로, 마이크로서비스 아키텍처에서 필수적인 역할을 수행합니다.
- 주요 특징
- 루팅 및 필터링
- 클라이언트 요청을 받아 특정 서비스로 라우팅하고, 필요한 인증 및 권한 부여를 수행합니다.
- 예를 들어, 인증된 사용자만 특정 서비스에 접근할 수 있도록 설정할 수 있습니다.
- 보안
- 외부 요청으로부터 애플리케이션을 보호하고, 보안 정책을 적용합니다.
- 이를 통해 악성 요청이나 공격으로부터 시스템을 방어할 수 있습니다.
- 효율성
- 마이크로서비스 아키텍처에서 필요한 요청 처리 및 분산 환경의 관리를 효율적으로 수행합니다.
- 성능 최적화와 함께 안정성을 제공합니다.
- 루팅 및 필터링
구성 관리
구성 관리는 분산 시스템에서 애플리케이션의 설정을 중앙에서 관리하고 동기화하는 중요한 역할을 합니다.
- Spring Cloud Config
- Spring Cloud Config는 분산된 환경에서 중앙 집중식 설정 관리를 제공
- 주요 특징
- Config 서버
- 중앙에서 설정 파일을 관리하고, 각 서비스에 제공하는 역할을 합니다.
- Config 서버는 설정 파일을 저장하고, 클라이언트 서비스가 이를 조회하여 사용하는 방식으로 동작합니다.
- Config 클라이언트
- Config 서버에서 설정을 받아서 사용하는 서비스입니다.
- 클라이언트 서비스는 Config 서버와 통신하여 최신 설정을 주입받아 사용할 수 있습니다.
- 설정갱신
- 설정 변경 시
서비스 재시작없이 실시간으로 변경 사항을 반영할 수 있습니다. - 이를 통해 설정 변경이 필요할 때 시스템의
중단없이 즉시 적용할 수 있습니다.
- 설정 변경 시
- Config 서버