인프라 기술 및 아키텍처

02. MSA - Spring Cloud

Dev.99_tale 2025. 2. 8. 20:07

Spring Cloud는 MSA(Microservices Architecture)를 쉽게 구현하고 운영할 수 있도록 다양한 기능을 제공하는 확장된 스프링 프레임워크이다.

이번 글에서는 Spring Cloud의 주요 개념과 핵심 기능을 정리해보도록 한다!


02.  Spring Cloud

- MSA를 쉽게 구현하고 운영할 수 있게 다양한 도구와 서비스를 제공하는 확장된 스프링 기반 프레임워크

Spring Cloud 주요 모듈

- 서비스 등록 및 디스커버리, 로드 밸런싱, 서킷 브레이커

Spring Cloud 구성 요소의 활용

- API 게이트 웨이, 구성 관리

Spring Cloud 적용 사례

 

주요기능

주요기능
서비스 등록 및 디스커버리(조회)
→ 각 서비스가 어디 있는지 자동으로 찾을 수 있도록 등록 & 검색
Eureka, Consul, Zookeeper
로드 밸런싱(트래픽 분산)
→ 여러 서버 중에서 적절한 서버로 요청을 분배
Ribbon, Spring Cloud LoadBalancer
서킷 브레이커(차단기)
→ 특정 서비스가 문제가 생기면 자동으로 차단하고 복구
Resilience4j, Hystrix(현직)
API 게이트웨이
→ 모든 요청을 한 곳에서 통제 & 라우팅 & 필터링
Spring Cloud Gateway, Zuul(현직)
구성 관리
→ 설정값을 중앙에서 관리 & 변경 가능
Spring Cloud Config
분산 추적
→ 여러 서비스에서의 요청 흐름을 추적 & 분석
Spring Cloud Sleuth, Zipkin
메시징 
→ 서비스 간 비동기 통신을 위한 메시지 큐 지원
Kafka, RabbitMQ, Spring Cloud Stream

주로 쓰이는 것

📌 "Spring Cloud를 사용하면 MSA 환경에서 필요한 기능을 손쉽게 구현할 수 있다!"


Spring Cloud 주요 모듈

- 서비스 등록 및 디스커버리, 로드 밸런싱, 서킷 브레이커

서비스 등록 및 디스커버리

"각 서비스가 어디 있는지 자동으로 등록 & 검색하는 기능!"

🔹 Eureka (넷플릭스 개발)

  • 서비스 레지스트리 역할 → 모든 서비스 인스턴스의 위치를 저장 및 동적으로 관리
  • 헬스 체크(Health check) 지원 → 서비스의 상태를 주기적으로 확인하여 가용성을 보장
  • 자동 서비스 등록 & 검색 → 클라이언트가 직접 IP를 몰라도 Eureka를 통해 찾을 수 있음

📌 "Eureka를 사용하면 각 마이크로서비스의 위치를 자동으로 관리할 수 있다!"

 

로드 밸런싱 (트래픽 분산)

"여러 서버 중에서 적절한 서버로 요청을 분배하는 기능!"

🔹 Ribbon (넷플릭스 개발)

  • 클라이언트 사이드 로드 밸런서 → 클라이언트가 직접 요청을 분배
  • 서버 리스트 제공자 → Eureka에서 서비스 목록(인스턴스 리스트)을 받아와 사용
  • 다양한 로드 밸런싱 알고리즘 지원 → 라운드 로빈, 가중치 기반 등
  • Failovery: 요청 실패 시 다른 인스턴스로 자동 전

📌 "Ribbon을 사용하면 트래픽을 여러 서버에 자동으로 분배할 수 있다!"

 

서킷 브레이커 (Circuit Breaker)

"서비스 장애 발생 시 자동으로 차단하여 시스템을 보호하는 기능!"

🔹 Hystrix (넷플릭스 개발)

  • 서킷 브레이커 상태 관리 → Closed, Open, Half-Open 상태를 통해 호출 실패를 감지
  • Failback 지원 → 장애 발생 시 대체 로직 제공
  • Hystrix Dashboard 지원 → 서킷 브레이커 상태 모니터링 가능

🔹 Resilience4j (Hystrix 대체)

  • 경량 서킷 브레이커 라이브러리 → Hystrix보다 가볍고, 더 유연한 기능 제공
  • Failback 지원 → 장애 발생 시 대체 로직 제공
  • 재시도(Retry) 지원 -> 일시적인 네트워크 문제 등에 대응할 수 있음
  • 타임아웃 설정 가능 → 느린 응답을 감지하여 자동 차단

📌 "Resilience4j는 최신 MSA 환경에서 널리 사용되는 서킷 브레이커 라이브러리이다!"


Spring Cloud 구성 요소의 활용

- API 게이트 웨이, 구성 관리

 

API 게이트웨이 -> MSA에서 필수적인 역할

"모든 요청을 한 곳에서 통제하고, 필요한 서비스로 라우팅하는 기능!"

🔹 Zuul (넷플릭스 개발)

  • 라우팅 기능 제공 → 요청 URL에 따라 적절한 서비스로 요청 전달
  • 필터 기능 지원 → 요청 전후로 다양한 작업 수행 가능
  • 모니터링 기능 지원 → 요청 로그 및 서비스 상태 모니터링 가능

🔹 Spring Cloud Gateway

  • Spring Cloud에서 제공하는 공식 API 게이트웨이
  • 보안 기능 제공 → 외부 요청을 차단하고, 인증 & 권한 관리 가능
  • 효율적인 요청 분배 → 마이크로서비스 간의 요청을 최적화

📌 "Spring Cloud Gateway는 최신 API 게이트웨이 솔루션으로, Zuul보다 확장성이 뛰어나다!"

 

구성 관리 (Configuration Management)

"설정값을 중앙에서 관리하고, 변경 사항을 실시간으로 반영하는 기능!"

🔹 Spring Cloud Config

  • Config 서버 → 설정 파일을 중앙에서 관리 & 제공
  • Config 클라이언트 → 설정을 서버에서 받아서 사용
  • 실시간 설정 변경 가능 → 서비스 재시작 없이 설정 반영 가능

📌 "Spring Cloud Config를 사용하면 모든 서비스의 설정을 한 곳에서 효율적으로 관리할 수 있다!"

 

 

🔥 핵심 정리

개념 설명 대표 기술
서비스 등록 & 디스커버리 서비스 위치 자동 등록 & 검색 Eureka, Consul, Zookeeper
로드 밸런싱 요청을 여러 서버로 분배 Ribbon, Spring Cloud LoadBalancer
서킷 브레이커 장애 발생 시 자동 차단 & 복구 Resilience4j, Hystrix
API 게이트웨이 모든 요청을 한 곳에서 통제 & 라우팅 Spring Cloud Gateway, Zuul
구성 관리 설정값을 중앙에서 관리 Spring Cloud Config

 


Spring Cloud의 적용 사례

Netflix - 배경 -> MSA로의 전환 이유 -> 전환 과정 -> 결과

 

Netflix

  • 배경 (원래 DVD대여점에서 스트리밍으로 전환)
    • 넷플릭스는 2000년대 후반 데이터 베이스 장애를 통해 심각한 서비스 장애를 겪는다.
    • 사용자가 급격히 증가함에 따라 빠르게 증가하는 트래픽과 사용자 요구를 감당하기 어려워짐
    • 또한 신뢰성 높고 수평 확장이 가능한 클라우드 시스템으로 이전할 필요성을 느낌.
    • 폭발적인 사용자 증가, 빈번한 서비스 장애, 인프라 확장의 어려움, 빠른 기능 배포의 필요성, 클라우드 전환 등의 계기로 인해 모놀리식에서 MSA 전환이 시작
  • MSA로의 전환 이유
    • 확장성(Scalability): 넷플릭스는 글로벌 서비스를 제공하며, 수백만 명의 사용자가 동시 접속할 수 있는 인프라가 필요했음
    • 신뢰성(Reliability): 한 부분의 장애가 전체 시스템에 영향을 미치지 않도록 해야 했음
    •  개발 속도(Speed of Development): 새로운 기능을 빠르게 배포하고, 독립적인 팀이 동시에 작업할 수 있는 환경을 필요로 함
  • 전환 과정
    • 서비스 분리: 넷플릭스는 기존 모놀리식 애플리케이션을 여러 개의 독립적인 마이크로서비스로 분리했습니다.
    • 자동화 도구 도입: CI/CD 파이프라인을 구축하여 코드의 빌드, 테스트, 배포 과정을 자동화했습니다. 이를 통해 개발 속도를 크게 향상시켰습니다.
    • 자체 도구 개발: 넷플릭스는 Hystrix, Eureka, Ribbon 등의 도구를 개발하여 서비스 간 통신, 장애 복구, 로드 밸런싱 등을 효율적으로 처리했습니다.
    • 클라우드 인프라 활용: AWS와 같은 클라우드 인프라를 활용하여 서비스 확장성을 높였습니다.
  • 결과(제일 핵심적인 결과)
    • 향상된 확장성: 넷플릭스는 MSA 전환 이후 수천 개의 마이크로서비스를 운영하며, 글로벌 사용자 증가에 유연하게 대응할 수 있었습니다.
    • 높은 가용성: 서비스 장애 시 다른 서비스에 영향을 미치지 않고 독립적으로 복구할 수 있어, 사용자에게 지속적인 서비스를 제공할 수 있었습니다.
    • 빠른 배포 주기: 새로운 기능을 신속하게 개발하고 배포할 수 있어, 사용자 요구에 빠르게 대응할 수 있었습니다.



MSA를 그려보자 (구성도 그리는 능력을 익히기)

주문이 들어왔어! -> 주문확인 - 상품 확인 - 유저 확인 애플리케이션이 있겠네?

1. 그렇다면 필요한 어플리케이션은 ? Order, Product, User

2. 만약 주문에서 상품을 봐야해 어떻게 해 ? 컨트롤은 Ribbon에서 실제 호출은 Feign Client를 통해서 해준다.

3. host관리를 위해 Eureka서버에 모두 등록 (그럼 모든 APP들이 Eureka Client가 된다.)

4. 그럼 실제 Client가 각 어플들을 일일 호출해야해 ? API Gateway로 호출을 보내고 API Gateway에서 알아서 요청을 보내고 처리해준다.

5. 로그인된 사용자만 사용하게 해줘야 하지 않을까 ? API Gateway가 해주면 좋겠다!! 필터 기능으로 처리

6. 만약 Order가 Product와 User를 호출하는데 User 요청을 병렬처리 하다가 에러가 난다면 ? 서킷 브레이커(Resilience4j)를 통해 알아보도록 하자(Failover 처리), 에러 상황 처리에 대한 판단

7. 애플리케이션 마다 각각의 yml 파일(설정 파일)을 일일이 수정하는 번거로움을 해결하고 싶어 -> 그럼 모든 yml파일을 저장하는 Config서버를 만들자.

8. 주문이 들어왔고, 각 주문 -> 상품 -> 유저 확인 앱들에 호출이 들어가면 우리는 어떻게 호출이 되는지 몰라... 

 -> 그렇기 때문에 분산 추적( Zipkin)을 통해서 요청이 들어왔을때 어떻게 호출이 되는지 알아볼거야!

메시징은 대규모 시스템에서 알아보도록 하겠다. 이처럼 구성도를 그리는 능력을 기르는게 좋다.

 


📢  정리

Spring Cloud는 MSA를 쉽게 구현할 수 있도록 다양한 기능을 제공합니다.
서비스 등록, 로드 밸런싱, API 게이트웨이, 서킷 브레이커 등을 통해
마이크로서비스 간의 효율적인 통신과 안정성을 보장할 수 있습니다! 

 

참고로 처음 개발 시작을 Django를 시작했었다. 쉽게 접할 수 있다는 이유도 있었지만 인스타그램 같은 큰 어플이 Django로 구현되었기 때문에 시작했었다.

 하지만 처음 인스타그램도 모놀리식 아키텍처로 구현되었지만 사용자가 급증하면서 트래픽 문제, 확장성 한계를 느껴서 지금은 MSA로 전화한 상태라는걸 알게 되었어.

아직까지 Django로 동작하지만 큰 기능들은 Spring으로 대체해서 전환되고 동작한다는걸 알 수 있었어.

 

💡 인스타그램 또한, 사용자가 급증하면서 트래픽 문제, 확장성 한계를 느끼고, 지금 인스타그램은 점진적으로 MSA로 전환했지.

  • 읽기 트래픽 처리 개선캐싱 시스템 (Memcached, Redis) 추가
  • 이미지 & 동영상 처리 분리CDN(Content Delivery Network) 활용
  • 일부 기능을 마이크로서비스로 전환 → 피드, 댓글, 알림 시스템을 분리
  • 데이터 저장 방식 개선 → PostgreSQL + Cassandra + Elasticsearch 사용

정확하게는 완전한 MSA는 아니고, 일부는 모놀리식 구조를 유지하면서 하이브리드 방식으로 운영하고 있어.

 

공식 문서를 보고 블로그 작성하는 법을 기르면 좋다.(석진희 튜터님의 조언)

https://spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, short lived microservices and

spring.io