Easy Understanding

Spring Initializr를 통해 보는 스프링 각종 모듈 알아보기(3) - Spring Cloud 본문

Spring

Spring Initializr를 통해 보는 스프링 각종 모듈 알아보기(3) - Spring Cloud

appleg1226 2020. 11. 10. 02:17

11. Spring Cloud

Spring Initializr를 보시면 스프링 클라우드와 관련된 모듈들이 굉장히 많은 것을 보실 수 있습니다.

최근 개발의 트렌드는 MSA 환경과 Container 환경을 중심으로 새로운 기술들이 많이 나오고 발전하고 있는데,

Spring Cloud 또한 그러한 흐름에 맞게 관리되고 있는 프로젝트라고 할 수 있습니다.

 

스프링 클라우드는 MSA 아키텍쳐라고 하여,

많은 어플리케이션들이 하나의 어플리케이션처럼 동작하는 것처럼 보이도록 하는 여러가지 기능을 제공합니다.

MSA와 관련해서 가장 많이 참조되고 있는 글인 'The 12 Factor App'입니다.

12factor.net/ko/ 

 

The Twelve-Factor App (한국어)

배경 이 문서에 기여한 사람들은 수백개 앱의 개발과 배포에 직접 참여했으며, Heroku 플랫폼을 통해서 방대한 앱의 개발, 운영, 확장을 간접적으로 관찰했다. 이 문서는 실제로 쓰이는 다양한 SaaS

12factor.net

스프링 클라우드의 모든 모듈들은 12 Factor에 맞는 기능을 각각 제공하고 있습니다. 

 

1) Cloud

- Function(주목 할 만함)

요새 서버리스 컴퓨팅과 관련하여 나온 모듈입니다.

먼저 이 의존성을 추가하고, 메서드 하나짜리 프로그램을 작성하면 됩니다.

AWS, Azure, GCP 어댑터를 제공하며 연동 방법도 메뉴얼에 상세하게 나와 있습니다.


- Task(주목 할 만함)

Spring Cloud Task은 의존성에 추가함으로서 어플리케이션을 하나의 Task로 만듭니다.

Task를 적용하면 기존의 큰 어플리케이션이 아닌, 하나의 작업(Task)을 처리하는 단위 어플리케이션이 됩니다.

스프링 클라우드 스트림과 연동하여 메시지를 전달받아 일정한 작업을 실행시키는 역할도 할 수 있을 것 같습니다.


2) Spring Cloud Security

- Cloud Security / Cloud OAuth2(중요)

기존 Spring Security에 있던 기능을 Spring Cloud 레벨로 확장시킵니다.

기존에는 각 어플리케이션에서 security를 관리해줬으나,

Gateway 단에서 보안 관련처리를 진행한 뒤에, 분배된 서비스까지 인증 내용을 전달할 수도 있습니다.

스프링 클라우드 환경을 구축한다면 반드시 설정해야할 요소 중에 하나입니다.

 

3) Spring Cloud Config

MSA 환경에는 정말 많은 스프링 인스턴스들이 있고,

그것들을 일일히 설정 파일을 바꿔가면서 새로 빌드를 하는 과정 자체가 굉장히 번거롭습니다.

 

그래서 스프링 클라우드에서는 하나의 서버에서 Configuration 파일을 관리합니다.

Config 서버와 Github 같은 저장소를 연동함으로서 Commit 할 때마다 각 서비스의 설정을 반영하도록 해 줍니다.

 

많은 어플리케이션을 관리해야 하는 상황에서 많은 도움이 되며 꼭 필요한 파트라고 할 수 있습니다. 

 

- Config Client(필수): 관리하고자 하는 어플리케이션에 추가
- Config Server(필수): Configuration 서버에 추가 
- Vault Configuration(필요시 사용): Configuration 서버에 추가하여 비밀정보를 관리하는 Vault 서비스와 연동시킵니다.
- Apache Zookeeper Configuration / Consul Configuration(필요시 사용): 다른 Config 서비스를 이용할 수도 있습니다.

 

4) Spring Cloud Discovery

Discovery는 MSA 환경이 구성되는 가장 중요한 뼈대가 되는 기능입니다.

모든 MSA의 인스턴스들은 Discovery Server에 등록되며 그때가 되어서야 클라우드 환경 안으로 들어오게 됩니다.

한 번 클라우드 환경 안에 들어왔다면, 각각의 인스턴스들을 URL이 아닌 서비스 이름으로서 관리할 수 있습니다. 

 

- Eureka Discovery Client / Eureka Server(필수)

가장 대표적인 Discovery 모듈입니다. 관리할 서버에는 Eureka Server를 설정하고,

나머지 서비스 인스턴스에는 Client를 설정해주면 됩니다.

Eureka Server는 자체적으로 GUI 대시보드도 제공하고 있어서 등록된 서비스를 쉽게 확인할 수 있습니다.


- Apache Zookeeper Discovery / Cloud Foundry Discovery / Consul Discovery(선택)

디스커버리 서비스는 유레카 이외에 다른 방법으로 사용할 수도 있습니다.


5) Spring Cloud Routing

MSA 서비스에서 또 필수적으로 필요한 것이 트래픽을 관리해주는 단일 점을 제공하는 것입니다.

외부에서 MSA 서비스에 접근하려면 Gateway의 주소로 접근해야 하며,

Gateway에서는 각 MSA 서비스로 HTTP 요청을 연결시켜줍니다. 

 

또한 부하 분산도 중요한 기능 중에 하나입니다.

로드밸런서는 프로그래밍적으로 구현되어 의존성을 추가하여 로드밸런싱을 구현할 수 있습니다.


- Zuul / Gateway(필수)

스프링 클라우드에는 현재 여러 개의 구현체가 있습니다.

이전까지 Spring Cloud 프로젝트에는 대부분이 Netflix에서 구현한 라이브러리들이었습니다.

Eureka, Zuul, Ribbon, Hystrix 같은 것들이 Netflix에 포함된 것들이지만, 현재는 개발이 중단되었습니다.

 

그래서 스프링 진영에서 새롭게 개발하고 있는 프로젝트들이 많이 있는데 그 중에 하나가 Gateway입니다.

Zuul, Gateway는 둘 다 기능은 같지만, 이후로는 Gateway를 사용하는 것이 나을 것 같습니다.


- Ribbon / Cloud LoadBalancer(필수)

Ribbon은 Netflix에서 개발한 라이브러리이며, Cloud LoadBalancer는 스프링 진영에서 개발했습니다.

로드밸런스를 등록하면 MSA 어플리케이션간 요청에서 자동으로 요청을 분산시킵니다.

Ribbon 또한 현재는 개발이 중단되었으므로, Cloud LoadBalancer를 사용하면 될 것 같습니다.

 

- OpenFeign(필수)

OpenFeign은 어플리케이션 간에 REST 요청을 보내는 라이브러리입니다.

스프링 MVC와 비슷한 방식으로 서비스 간 요청을 간단하게 처리할 수 있습니다.

또한 LoadBalancer와 연동하여 요청의 분산도 가능합니다.


6) Spring Cloud Circuit Breaker

서킷브레이커는 분산 시스템에서 지연과 장애를 다룹니다.

만약 문제가 길어진다면 이름인 Circuit Breaker(차단기)처럼, 해당 서비스를 차단합니다.

여러 인스턴스로 이루어진 MSA 환경에서는 문제가 생기는 인스턴스가 있다면

더 큰 문제가 생기지 않도록 문제를 미리 발견하고 그 트래픽을 끊는 서킷브레이커가 반드시 필요합니다.

 

- Hystrix / Hystrix Dashboard(필수): 서킷 브레이커
- Turbine / Turbine Stream(선택): Hystrix의 Metric을 수집
- Resilience4J(필수): Spring Cloud 오리지널 서킷브레이커

 

서킷브레이커도 Hystrix가 개발이 중지되었으므로 이후로는 Resilience4J를 사용해야 할 것 같습니다.

7) Spring Cloud Tracing

여러 인스턴스들이 거미줄처럼 꼬여있는 MSA 환경에서 데이터가 어떻게 흘러가고 있는가를

알아내는 것은 구현하기가 쉽지 않습니다.

그러나 Sleuth와 Zipkin을 이용하면 이 모든 과정을 눈으로 확인할 수 있습니다.

 

- Sleuth(필수)

각 로그에 Span ID, Trace ID를 더하며,

모든 인스턴스에서 이 ID를 통해 같은 작업들을 확인할 수 있습니다. 


- Zipkin Client(필수)

Zipkin Server는 Spring에 모듈이 없어서 직접 설치하여서 띄워야 합니다.

각 Spring 어플리케이션에는 이 Client를 의존성에 넣어주면 됩니다.

Zipkin Dashboard에서는 어떤 순서로 얼마나 걸렸는지를 눈으로 간단하게 볼 수 있게 됩니다.


8) Spring Cloud Messaging

- Cloud Bus(추천)

클라우드 버스는 RabbitMQ, Kafka를 이용합니다.

분산된 환경에서 여러 인스턴스에 메시지를 브로드캐스팅하고 싶을 때 이용합니다.

그래서 Config 서버를 이용할 때, Config Server에 Cloud Bus를 적용하면 더 자동화된 설정 적용을 할 수 있습니다.


- Cloud Stream(메시징을 사용한다면 필수)

Spring Integration을 Cloud 레벨로 가져온 모듈입니다.

RabbitMQ, Kafka에 대한 연결을 지원하고 있습니다.

Cloud Discovery에 등록된 서비스들 간의 메시징 처리가 추상화 되어 있기 때문에 간단하게 처리할 수 있습니다.

 


12. Cloud Service

아래의 서비스들은 각 클라우드 서비스 상품들을 스프링과의 통합을 통해 관리하기 편하도록 해줍니다.

각 클라우드 서비스를 자바 코드를 이용해서 프로그래밍적으로 관리할 수 있도록 해 줍니다.

 

- Amazon Web Servies: AWS Core, AWS RDS, AWS Simple Queue Service

- Microsoft Azure: Azure Support, Azure Active Directory, Azure Key Vault, Azure Storage

- Google Cloud Platform: GCP Support, GCP Messaging, GCP Storage

- Alibaba