Spring cloud와 MSA
1. MSA(마이크로서비스 아키텍처)
- 하나의 애플리케이션을 여러 개의 작은 서비스로 나누어 개발하고 운영하는 방식으로 각각의 서비스는 독립적으로 개발되고 배포될 수 있으며, 필요에 따라 확장하거나 수정할 수 있다
[모놀리식 아키텍처 VS 마이크로 서비스 아키텍처]
-모놀리식 아키텍처(Monolithic Architecture)
- 모든 기능이 하나의 애플리케이션에 포함되어 한 개의 코드베이스에서 모든 기능이 동작하는 방식
- 예를들어 온라인 쇼핑몰이라는 하나의 애플리케이션 안에 회원관리, 상품조회, 배송, 결제 시스템 등등 전부 포함되어 있는 것
- 장점 : 단순 구조, 한 번의 배포
- 단점 : 코드 커지면 유지보수 어려움, 특정 기능 수정해도 전체 서비스 재배포 필요
-마이크로서비스 아키텍처
- 기능별로 독립적인 작은 서비스를 나눠서 운영하는 방식으로 각 서비스가 독립적으로 실행되고 배포될 수 있다.
- MSA로 변경한 온라인 쇼핑몰 구조
마이크로서비스 담당기능 회원 서비스 회원 가입, 로그인 상품 서비스 상품 조회, 추천 상품 주문 서비스 장바구니, 주문 생성 결제 서비스 결제, 환불 배송 서비스 배송 요청, 배송 상태 조회 - 장점 : 특정 서비스만 수정 및 배포 가능, 확장성 뛰어남, 변화에 빠르게 대응 가능
- 단점 : 서비스 간 통신 필요, 운영 복잡
2. Spring Cloud란?
분산 시스템에서 필요한 다양한 기능들을 추상화하여 제공하고 마이크로 서비스 아키텍처(MSA)를 구현할 때 유용하게 사용된다
Spring Cloud는 MSA 구축을 위한 다양한 기능을 제공한다.
- 서비스 디스커버리(Service Discovery)
- 마이크로서비스 환경에서는 각 서비스의 위치가 변할 수 있기 때문에 이를 자동으로 감지하고 관리해야 한다.
- Spring Cloud에서는 Eureka(Netflix OSS 기반) 또는 Consul, Zookeeper 등을 활용하여 서비스 디스커버리를 구현할 수 있다.
- API Gateway
- 클라이언트가 여러 개의 마이크로서비스를 호출하는 경우 API Gateway를 통해 일관된 인터페이스를 제공할 수 있다.
- Spring Cloud에서는 Spring Cloud Gateway 또는 Zuul을 활용하여 API Gateway를 구축할 수 있다.
- 분산 설정(Config Server)
- 마이크로서비스별로 설정 파일을 관리하기 어려우므로, Spring Cloud Config를 이용하여 중앙에서 설정을 관리할 수 있다.
- 부하 분산(Load Balancing)과 라우팅
- 클라이언트 요청을 여러 인스턴스에 분산시키기 위해 Spring Cloud LoadBalancer 또는 Ribbon을 사용할 수 있다.
- 회로 차단기(Circuit Breaker) 및 장애 감지
- 특정 마이크로서비스에 장애가 발생할 경우 전체 시스템에 영향을 주지 않도록 보호하는 기능이다.
- Spring Cloud에서는 Resilience4j(기존 Hystrix 대체)를 활용하여 회로 차단 기능을 구현할 수 있다.
- 분산 트랜잭션 및 메시징
- 마이크로서비스 간 데이터 일관성을 유지하기 위해 SAGA 패턴을 적용할 수 있으며, Spring Cloud Stream을 통해 메시지 큐(Kafka, RabbitMQ) 기반의 비동기 통신을 지원한다.
- 분산 추적(Distributed Tracing)
- 마이크로서비스 환경에서는 서비스 간 호출이 많아지므로 요청 흐름을 추적하는 것이 중요하다.
- Spring Cloud Sleuth를 사용하면 요청에 고유한 트레이스 ID를 부여하여 서비스 간의 호출 관계를 추적할 수 있다.
- Zipkin과 연동하여 분산 추적 데이터를 시각화할 수도 있다.
Spring Cloud를 활용하면 서비스 간의 통신과 구성을 동적으로 관리할 수 있다. 예를 들어 Config 서버에서 서비스의 설정 정보를 제공하고, Gateway가 이를 활용하여 동적으로 라우팅 규칙을 변경할 수 있다. 또한, Discovery 서비스를 이용하여 실행 중인 서비스 인스턴스를 자동으로 탐색하고, 이를 기반으로 Gateway에서 부하 분산(로드 밸런싱) 규칙을 실시간으로 업데이트할 수 있다.
- Config 서버에서 서비스별 포트 정보를 가져와 Gateway의 라우팅 규칙을 자동으로 변경할 수 있다.
- Discovery 서비스를 통해 서비스 인스턴스의 상태를 지속적으로 추적하고, 이를 반영하여 Gateway에서 트래픽을 적절히 분산할 수 있다.
이를 통해 여러 개의 서비스 인스턴스를 클라이언트에게 투명하게 제공할 수 있으며, 높은 가용성과 확장성을 보장할 수 있다.
앞으로 차근차근 하나씩 알아가 보도록 하자!!
3. 정리
✅ Spring Cloud는 MSA 아키텍처를 손쉽게 구축할 수 있도록 다양한 기능을 제공하는 프레임워크이다. 마이크로서비스를 효율적으로 관리하기 위해 서비스 디스커버리, API Gateway, 부하 분산, 회로 차단기, 분산 설정 관리, 분산 추적 등의 기능을 활용할 수 있다.
MSA는 유지보수성과 확장성이 뛰어난 장점이 있지만, 서비스 간 통신 비용 증가, 데이터 일관성 문제 등의 단점도 존재하므로 적절한 전략을 세워 적용해야 한다.
Spring Cloud를 활용하면 이러한 문제를 보다 효과적으로 해결할 수 있으며 유연하고 확장 가능한 마이크로서비스 환경을 구축할 수 있다.