Spring Cloud
스프링 클라우드는 마이크로서비스 아키텍쳐(MSA) 기반의 시스템 구축을 도와주는 스프링 프레임워크의 확장이다. MSA 환경에서는 서비스 간 통신, 로드 밸런싱, 분산 구성 관리 등의 다양한 기능이 필요한데 스프링 클라우드는 이러한 기능을 손쉽게 구현할 수 있도록하는 다양한 모듈을 제공한다.
주요 기능
1. 서비스 디스커버리 (Service Discovery)
MSA 환경에서는 각 서비스의 위치(IP 및 포트)가 동적으로 변할 수 있다. 따라서 각각의 서비스들을 등록 및 검색할 수 있는 중앙 저장소 역할의 도구가 필요하다. 이를 통해 서비스 간의 동적 연결을 지원한다.
- Eureka
Netflix OSS 기반의 서비스 디스커버리 도구. 서비스 인스턴스가 실행될 때 자동으로 등록되며,클라이언트는 Eureka 서버를 통해 서비스의 위치를 조회할 수 있다.
로드 밸런싱과 장애 감지를 통한 서비스 회복 기능을 제공한다.
2. API 게이트웨이 (API Gateway)
모든 클라이언트의 요청을 한 곳에서 관리하는 진입점 역할. 클라이언트와 마이크로서비스 간의 통신을 중재하고, 요청을 적절한 서비스로 라우팅한다. 또한 인증/인가, 로깅, 부하 분산 등의 기능을 제공한다.
- Zuul
Netflix OSS 기반의 API 게이트웨이. 요청 라우팅, 필터링, 보안 등의 기능을 제공한다.
- Cloud Gateway
스프링 클라우드에서 제공하는 API 게이트웨이. 비동기 및 논블로킹 방식으로 동작하여 Zuul 보다 더 높은 성능을 제공한다.
3. 로드 밸런싱 (Load Balancing)
클라이언트 요청을 여러 인스턴스에 분배하여 부하를 균형있게 조절한다.
- Ribbon
Eureka와 연동하여 서비스 인스턴스 목록을 가져와 동적으로 로드 밸런싱을 수행할 수 있다. 클라이언트는 Ribbon을 통해 서비스에 대한 여러 개의 인스턴스 중 하나를 선택하여 요청을 보내는 방식으로, 클라이언트 사이드 로드 밸런싱 방식이라고도 한다. 분산 전략으로 라운드 로빈, 가중치 기반 등 다양한 로드밸런싱 알고리즘을 지원한다.
4. 서킷 브레이커 (Circuit Breaker)
서킷 브레이커는 마이크로서비스 간의 호출 실패를 감지하고 지연이나 실패를 처리하여 시스템의 전체적인 안전성을 유지하는 역할을 하며 빠르게 장애 부분을 격리하고 시스템의 다른 부분에 영향을 주지 않도록 한다.
- Hystrix
Netflix OSS 기반의 서킷 브레이커 라이브러리.
- Resilience4j
Hystrix의 대체 도구로, 경량화되고 모듈화된 자바 기반의 서킷 브레이커 라이브러리. 서킷 브레이커가 open되면 특정 임계치를 초과한 요청을 차단하고, 일정 시간이 지나면 다시 정상 동작을 시도할 수 있다. 실패 시 Failback 매커니즘을 통해 대체 동작을 수행한다.
5. 설정 관리 (Config Server)
여러 마이크로서비스의 설정을 중앙에서 관리하고, 변경 사항을 실시간으로 반영하도록 할 수 있다.
- Spring Cloud Config
중앙 집중식 구성 관리를 제공하는 프레임워크. Spring Cloud Bus를 사용하면 서비스 재시작 없이도 설정 반영이 가능하다.
6. 분산 추적
분산 시스템에서 서비스 간의 요청 흐름을 추적하여 모니터링하는 기능이다.
- Zipkin
각 요청에 고유한 추적 ID를 부여하여 요청의 흐름을 시각화 할 수 있다. 요청의 시작부터 끝까지의 경로를 추적하여 지연 시간, 오류 등의 정보를 수집한다. 또한 특정 요청을 검색하고 필터링하여 문제를 진단할 수 있다.
7. 이벤트 드리븐 아키텍처 (Event-Driven Architecture)
이벤트 드리븐 아키텍처는 시스템에서 발생하는 이벤트를 기반으로 동작하는 소프트웨어 설계 방식이다. 이벤트는 비동기적으로 처리되며, 서비스 간의 결합도를 낮추고 확장성을 높인다.
- Spring Cloud Stream
이벤트 드리븐 아키텍처를 구현하기 위한 프레임워크. 메시지 브로커(Kafka, RabbitMQ 등)를 통해 이벤트 스트리밍을 처리한다. 예시로 알림 기능 등이 있다.