정리
- MSA 개념
- 모놀리식 vs MSA
- Spring Cloud
- Eureka
- FeignClient + LoadBalancing
- 서킷브레이커: Resilience4j
- API Gateway
- Spring Cloud Config
MSA란
Microservices Architecture(MSA) 는 하나의 애플리케이션을 여러 개의 독립적인 서비스로 분리하여 개발, 배포, 유지보수를 용이하게 하는 소프트웨어 아키텍처 스타일이다. 각 서비스는 특정 비즈니스 기능을 수행하며, 서로 독립적으로 배포되고 확장될 수 있다. 서비스 간의 통신은 HTTP/HTTPS, 메시지 큐 등을 통해 이루어진다.
특징
- 독립적인 배포 가능성: 각 서비스는 독립적으로 배포할 수 있으며, 다른 서비스에 영향을 주지 않고 업데이트할 수 있음
- 작은 팀 구성: 각 서비스는 작은 팀이 독립적으로 개발하고 관리할 수 있음
- 기술 스택의 다양성: 각 서비스는 적절한 기술 스택을 자유롭게 선택할 수 있음
모놀리식 아키텍처와 비교


| 모놀리틱 아키텍처 | MSA | |
| 정의 | * 하나의 큰 코드 베이스로 구성된 애플리케이션 * 모든 기능이 하나의 애플리케이션 내에 포함 |
* 여러 개의 독립적인 서비스로 구성된 애플리케이션 * 각 서비스는 특정 비즈니스 기능을 수행 |
| 장점 | * 간단한 배포 * 단일 데이터베이스 |
* 확장성 * 독립적 배포 * 유연성 : 서비스별로 적합한 기술 스택을 선택할 수 있음 |
| 단점 | * 확장성 부족 * 긴 개발 주기 * 유연성 부족 |
* 복잡성 증가 * 운영비용 증가 * 데이터 관리 : 분산된 데이터베이스로 인해 데이터 일관성 유지가 어려울 수 있음 * 네트워크 지연 : 서비스 간의 통신이 네트워크를 통해 이루어지므로 지연 시간이 발생할 수 있음 * 서비스마다 통신 |
Spring Cloud란?
마이크로서비스 개발을 위해 다양한 도구와 서비스를 제공하는 스프링 프레임워크의 확장이다.
주요 기능
- 서비스 등록 및 디스커버리:
Eureka, Consul, Zookeeper - 로드 밸런싱:
Ribbon, Spring Cloud LoadBalancer - 서킷 브레이커:
Hystrix, Resilience4j - API 게이트웨이:
Zuul, Spring Cloud Gateway - 구성 관리:
Spring Cloud Config - 분산 추적: Spring Cloud Sleuth,
Zipkin - 메시징: Spring Cloud Stream
Eureka : 서비스 등록 및 디스커버리
- 넷플릭스가 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리
- 주요 특징:
- 서비스 레지스트리: 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소
- 헬스 체크(Health check): 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성을 보장
Ribbon : 로드 밸런싱
- 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 서비스 인스턴스 간의 부하를 분산
- 주요 특징:
- 서버 리스트 제공자: Eureka로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용
- 로드밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원
- Failover: 요청 실패 시 다른 인스턴스로 자동 전환
Hystrix : 서킷 브레이커
- 넷플릭스가 개발한 서킷 브레이커 라이브러리로, 서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지
- 주요 특징:
- 서킷 브레이커 상태: 클로즈드, 오픈, 하프-오픈 상태를 통해 호출 실패를 관리
- Failback: 호출 실패 시 대체 로직을 제공하여 시스템 안정성 확보
- 모니터링: Hystrix Dashboard를 통해 서킷 브레이커 상태 모니터링
Resilience4j : 서킷 브레이커
- Resilience4j는 자바 기반의 경량 서킷 브레이커 라이브러리로, 넷플릭스 Hystrix의 대안으로 개발
- 주요 특징:
- 서킷 브레이커: 호출 실패를 감지하고 서킷을 열어 추가적인 호출을 차단하여 시스템의 부하를 줄임
- Failback: 호출 실패 시 대체 로직을 실행하여 시스템의 안정성을 유지
- 타임아웃 설정: 호출의 응답 시간을 설정하여 느린 서비스 호출에 대응할 수 있음
- 재시도: 재시도 기능을 지원하여 일시적인 네트워크 문제 등에 대응할 수 있음
Zuul : API 게이트웨이
- 넷플릭스가 개발한 API 게이트웨이로, 모든 서비스 요청을 중앙에서 관리
- 주요 특징:
- 라우팅: 요청 URL에 따라 적절한 서비스로 요청 전달
- 필터: 요청 전후에 다양한 작업을 수행할 수 있는 필터 체인 제공
- 모니터링: 요청 로그 및 메트릭을 통해 서비스 상태 모니터링 할 수 있음
Spring Cloud Config : 구성관리
- Spring Cloud Config는 분산된 환경에서 중앙 집중식 설정 관리를 제공
- 주요 특징:
- Config 서버: 중앙에서 설정 파일을 관리하고 각 서비스에 제공
- Config 클라이언트: Config 서버에서 설정을 받아서 사용하는 서비스
- 설정갱신: 설정 변경 시 서비스 재시작 없이 실시간으로 반영
서비스 디스커버리 : Eureka
서비스 디스커버리란?
마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능을 한다. 각 서비스는 등록 서버(eureka)에 자신의 위치를 등록하고 각 서비스간의 통신도 이를 조회하여 위치를 찾는다. 주요 기능으로는 서비스 등록, 서비스 조회, 헬스 체크 등이 있다.
Eureka란?
- 넷플릭스가 개발한 서비스 디스커버리 서버
- 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소 역할을 하며, 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성 보장
- 여러 인스턴스를 지원하여 고가용성을 유지할 수 있음
로드밸런싱 : 클라이언트 사이드 로드 밸런싱 개요
로드밸런싱이란?
로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술을 의미한다. 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지한다.
종류 : 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱
클라이언트 사이드 로드 밸런싱이란?
- 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보내는 방식
- 클라이언트는 서버의 목록을 가지고 있으며, 이를 바탕으로 로드 밸런싱 수행
각 서비스 간의 통신 방법 중 FeignClient란?
FeignClient란?
- FeignClient는 Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 Restful 웹 서비스를 호출할 수 있음
- Eureka와 같은 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱 수행
주요 특징
- 선언적 HTTP 클라이언트 : 인터페이스와 어노테이션을 사용하여 REST API 호출
- Eureka 연동
- 자동 로드 밸런싱 : Ribbon이 통합되어 있어 자동으로 로드 밸런싱 수행
예시 시나리오
Order 서비스는 Product 서비스를 호출하여 상품 정보를 가져옵니다. 이 과정에서 어떻게 동작하는지 설명하겠습니다.
- Order 서비스 인스턴스: 1개
- Product 서비스 인스턴스: 3개
- Order 서비스 실행: Order 서비스가 실행되면 Eureka 서버에서 Product 서비스 인스턴스 목록을 가져옵니다.
- Product 서비스 호출: Order 서비스에서 Product 서비스의 정보를 가져오기 위해 FeignClient를 사용하여 호출합니다.
- Ribbon을 통한 로드 밸런싱: FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출합니다. 이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배합니다.
- 응답 처리: 선택된 Product 인스턴스에서 응답을 받아 Order 서비스에 반환하고, 최종적으로 클라이언트에 응답을 전달합니다.

서킷브레이커 : Resilience4j
서킷브레이커란?
마이크로서비스 간의 호출 실패를 감지하고, 시스템의 전체적인 안정성을 유지하는 패턴이다. 외부 서비스 호출 실패 시 빠른 실패를 통해 장애를 격리하고, 시스템의 다른 부분에 영향을 주지 않도록 한다.
- 상태 변화 : 클로즈드 → 오픈 → 하프-오픈
서킷 브레이커 상태:
클로즈드, 오픈, 하프-오픈 상태를 통해 호출 실패를 관리
클로즈드(Closed):- 기본 상태로, 모든 요청을 통과시킵니다.
- 이 상태에서 호출이 실패하면 실패 카운터가 증가합니다.
- 실패율이 설정된 임계값(예: 50%)을 초과하면 서킷 브레이커가 오픈 상태로 전환됩니다.
- 예시: 최근 5번의 호출 중 3번이 실패하여 실패율이 60%에 도달하면 오픈 상태로 전환됩니다.
오픈(Open):- 서킷 브레이커가 오픈 상태로 전환되면 모든 요청을 즉시 실패로 처리합니다.
- 이 상태에서 요청이 실패하지 않고 바로 에러 응답을 반환합니다.
- 설정된 대기 시간이 지난 후, 서킷 브레이커는 하프-오픈 상태로 전환됩니다.
- 예시: 서킷 브레이커가 오픈 상태로 전환되고 20초 동안 모든 요청이 차단됩니다.
하프-오픈(Half-Open):- 오픈 상태에서 대기 시간이 지나면 서킷 브레이커는 하프-오픈 상태로 전환됩니다.
- 하프-오픈 상태에서는 제한된 수의 요청을 허용하여 시스템이 정상 상태로 복구되었는지 확인합니다.
- 요청이 성공하면 서킷 브레이커는 클로즈드 상태로 전환됩니다.
- 요청이 다시 실패하면 서킷 브레이커는 다시 오픈 상태로 전환됩니다.
- 예시: 하프-오픈 상태에서 3개의 요청을 허용하고, 모두 성공하면 클로즈드 상태로 전환됩니다. 만약 하나라도 실패하면 다시 오픈 상태로 전환됩니다.
Fallback 매커니즘
- Fallback 메서드는 외부 서비스 호출이 실패했을 때 대체 로직을 제공하는 메서드
장점
- 시스템의 안정성을 높이고, 장애가 발생해도 사용자에게 일정한 응답을 제공할 수 있습니다.
- 장애가 다른 서비스에 전파되는 것을 방지합니다.
API Gateway
API 게이트웨이란?
클라이언트의 요청을 받아 백엔드 서비스로 라우팅하고, 다양한 부가 기능을 제공하는 중간 서버이다. 클라이언트와 서비스 간의 단일 진입점 역할을 하며, 보안, 로깅, 모니터링, 요청 필터링 등을 처리한다.
주요기능
- 라우팅: 클라이언트 요청을 적절한 서비스로 전달
- 인증 및 권한 부여: 요청의 인증 및 권한을 검증
- 로드 밸런싱: 여러 서비스 인스턴스 간의 부하 분산
- 모니터링 및 로깅: 요청 및 응답을 로깅하고 모니터링
- 요청 및 응답 변환: 요청과 응답을 변환하거나 필터링
Spring Cloud Gateway란?
Spring 프로젝트의 일환으로 개발된 API 게이트웨이로, 클라이언트 요청을 적절한 서비스로 라우팅하고 다양한 필터링 기능을 제공한다.
주요특징
- 동적 라우팅: 요청의 URL 패턴에 따라 동적으로 라우팅
- 필터링: 요청 전후에 다양한 작업을 수행할 수 있는 필터 체인 제공
- 모니터링: 요청 로그 및 메트릭을 통해 서비스 상태 모니터링
Spring Cloud Gateway 필터링
필터종류
- Global Filter: 모든 요청에 대해 작동하는 필터
- Gateway Filter: 특정 라우트에만 적용되는 필터
필터 구현
- 필터를 구현하려면
GlobalFilter또는GatewayFilter인터페이스를 구현하고,filter메서드를 오버라이드해야 합니다.
Config
Spring Cloud Config 란?
분산 시스템 환경에서 중앙 집중식 구성 관리를 제공하는 프레임워크이다. 애플리케이션의 설정을 중앙에서 관리하고, 변경 사항을 실시간으로 반영할 수 있다. Git, 파일 시스템, JDBC 등 다양한 저장소를 지원한다.
주요기능
- 중앙 집중식 구성 관리 : 모든 마이크로서비스의 설정을 중앙에서 관리
- 환경별 구성 : 개발, 테스트, 운영 등 환경별로 구성을 분리하여 관리
- 실시간 구성 변경: 설정 변경시 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있따.
'MSA' 카테고리의 다른 글
| MSA 환경에서 JitPack으로 공통 모듈 관리하기 (1) | 2026.01.11 |
|---|