공부하는 스누피

[MSA] 스프링 클라우드 본문

Web/Spring

[MSA] 스프링 클라우드

커피맛스누피 2021. 1. 10. 00:05

스프링 클라우드는 분산 시스템을 자주 쓰이는 패턴으로 빠르게 구축할 수 있게 해준다.

2015년에 1.0 버전으로 출시되었으며, 넷플릭스 OSS 도구를 기반으로 했다.

2019년에는 2.1 버전을 출시하면서 넷플릭스 도구를 대체하는 컴포넌트를 제시했다. Resilience4j, 스프링 클라우드 로드 밸런서 등이 대체 컴포넌트에 해당된다. 또한, Azure, AWS, GCP같은 클라우드 플랫폼 서비스를 지원하는 기능이 추가되었다. 

자주 쓰이는 패턴과 컴포넌트

- 서비스 검색
: 스프링 클라우드 로드 밸런서를 사용한다.
- 에지 서버
: 스프링 클라우드 Gateway, 스프링 시큐리티 OAuth
- 서킷 브레이커
: Resilience4j 컴포넌트를 사용한다.
- 구성 중앙화
: 스프링 클라우드 Config 서버를 사용한다.
- 분산 메시지 추적
: 스프링 클라우드 슬루스/집킨
...

스프링 클라우드에서 제공하는 기능은 한 포스트에서 다 다루기 어려워 위에서 나온 패턴을 중심으로 스프링 클라우드에서 자주 쓰이는 프로젝트들을 하나씩 개괄해보았다.

 

Spring Cloud Config

중앙화된 외부 설정 관리 도구이다. 분산되어 있는 Spring 환경 설정을 담당하지만, Spring이 아닌 애플리케이션에도 쓰일 수 있다. 그래서 마이크로서비스 환경의 구성 정보를 중앙집중식으로 관리한다. 

애플리케이션이 테스트에서 배포 파이프라인으로 이동함에 따라 바뀌는 환경들의 구성 설정을 한 번에 관리할 수 있고, migrate할 때에도 필요한 구성 정보를 다 갖추었다고 확신할 수 있게 된다.

 

스프링 부트에서는 config server를 http://localhost:8888에서 접근할 수 있다. 

직접 서버를 구현하고자 한다면, spring-cloud-config-server 의존을 추가해야 한다. 구성 클래스임을 의미하는 @Configuration, @EnableConfigServer를 붙이고 @Value 어노테이션으로 spring.config.name=configserver 값을 설정하면 8888포트에서 컨피그 서버를 실행시킬 수 있다. spring.cloud.config.server.git.url을 @Value로 설정하면 구성 정보를 어느 Git repository에 저장할지 정할 수 있다.

 

 

스프링 클라우드 버스(Spring Cloud Bus)를 사용해 변경된 구성 정보에 영향을 받는 서비스로 메시지를 보낼 수 있다. 작동 방식은 다음과 같다.

1. 마이크로서비스는 컨피그 서버에 구성을 요청하면서 시작한다.
2. 컨피그 서버는 Git에서 구성(configuration)을 가져온다.
3. Git 저장소에서 commit이 push되면 컨피그 서버에 알림을 보내도록 할 수 있다.(optional)
4. 컨피그 서버는 스프링 클라우드 버스를 사용해 변경 이벤트를 게시하고, 이에 영향받는 마이크로서비스는 업데이트된 구성 정보를 받아 온다.

 

 

Spring Cloud Bus

서비스들을 분산 메시징으로 연결하는 이벤트 버스이다. 클러스터 안에서 생기는 변경 사항을 인스턴스들에게 알리는 데 유용하다. 그래서 브로드캐스팅과 비슷한 방식으로 작동되는데, AMQP와 Kafka가 포함되었다고 한다. 

RabbitMQ는 스프링 클라우드 버스 AMQP를 사용할 때 버스에 접근할 수 있게 하는 서버이다. localhost:5672가 디폴트 주소로 접근할 수 있다.

 

Spring Cloud Gateway

에지 서버(Edge server)는 마이크로서비스 환경을 보호하기 위해 사용된다. 스프링 클라우드 게이트웨이는 URL 경로 기반 라우팅과 OAuth2.0 등을 수행할 수 있다.

 

기존에 사용되던 넷플릭스 주울v1은 Blocking API를 사용했지만, 스프링 클라우드 게이트웨이는 스프링 기반의 Non-Blocking API를 사용한다는 점에서 차이가 있어 더 많은 양의 동시 요청을 처리할 수 있다. 에지 서버는 모든 외부 트래픽을 처리해야 해서 이러한 차이점이 더욱 중요하다고 한다.

 

스프링 클라우드 게이트웨이는 spring-cloud-starter-gateway 의존성을 추가하면 사용할 수 있다. RouteLocator 객체를 반환하는 customRouteLocator 메서드에서 http 요청과 라우팅할 uri를 체이닝 방식으로 매핑할 수 있다.

 

Spring Cloud Sleuth

스프링 클라우드 슬루스는 스프링 클라우드 애플리케이션을 추적하며, Zipkin과 같이 쓰인다. 추적하는 과정에서 마이크로서비스 사이를 오가는 요청 및 메시지의 흐름을 알 수 있고, 시각화할 수도 있다. Zipkin 의존성을 추가하면 9411 포트에서 추적을 확인할 수 있다고 한다.

 

Resilience4j

Resilience4j는 스프링 클라우드에서 서킷 브레이커로 쓰이며, 오픈 소스 기반 내결함성 라이브러리다. 

서비스의 장애 여부를 확인하고, 장애가 있을 경우 해결할 때까지 서킷을 열어서 대처할 수 있다. 

그래서 Resilience4j는 서비스의 탄력성을 보장해줄 수 있다.

 

 

(참고)

Hands-On Microservices with Spring Boot and Spring Cloud (2019). Magnus Larsson. Packet Publishing.

spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio a BOM (Bill of Materials) is published with a curated set of dependencies on the individual project. Go here to r

spring.io

 

Comments