MSA (Microservices Architecture)
애플리케이션을 독립적인 서비스로 나누어 개발, 배포, 유지보수를 용이하게 하는 소프트웨어 아키텍처 스타일이다. 모놀리틱 아키텍처는 단일 애플리케이션으로 관리한다. 간단하지만 확장성과 유연성이 떨어졌다. MSA는 서비스별로 독립적인 개발과 배포가 가능하다. 확장성과 유연성이 뛰어나지만 복잡성과 운영 비용이 증가한다.
Spring Cloud
Spring 프레임워크를 기반으로 MSA를 쉽게 구현하고 운영할 수 있도록 돕는 확장 도구이다.
Spring Cloud 주요 모듈
기능 | 모듈 | 설명 |
---|---|---|
서비스 등록/디스커버리 | Eureka | 서비스 위치를 동적으로 관리하도록 지원한다. |
로드 밸런싱 | Ribbon | 클라이언트 사이드 로드 밸런싱을 통해 요청 부하를 분산한다. |
서킷 브레이커 | Hystrix / Resilience4j | 서비스 호출 실패를 감지하고 시스템 안정성을 유지하도록 돕는다. |
API 게이트웨이 | Zuul / Cloud Gateway | 모든 서비스 요청을 중앙에서 관리하도록 지원한다. |
구성 관리 | Spring Cloud Config | 분산 환경에서 중앙 집중식 설정 관리를 제공한다. |
Spring Cloud 적용 사례
MSA로 전환한 이유
- 글로벌 서비스와 높은 동시 접속 환경을 지원해야 했다.
- 장애가 발생하더라도 전체 시스템에 영향을 주지 않아야 했다.
- 새로운 기능을 빠르게 배포하고 팀 간 독립적으로 작업할 필요가 있었다.
전환 과정
- 기존 모놀리틱 애플리케이션을 독립적인 마이크로서비스로 분리했다.
- CI/CD 파이프라인을 구축하여 빌드, 테스트, 배포 과정을 자동화했다.
- 넷플릭스 OSS 도구를 활용해 효율적으로 처리했다.
- AWS 같은 클라우드 인프라를 활용해 확장성을 높였다.
Eureka
서비스 디스커버리
각 서비스는 Eureka 서버에 자신의 위치를 등록한다. 다른 서비스는 등록된 정보를 조회해 통신할 수 있다.
구현 예시
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
헬스 체크
각 인스턴스의 상태를 확인하여 가용성을 유지했다. 기본 헬스 체크 엔드포인트는 /actuator/health
이다.
로드 밸런싱
클라이언트 사이드 로드 밸런싱
클라이언트가 여러 서버 중 하나를 직접 선택하여 요청을 보낸다.
FeignClient
선언적으로 RESTful 웹 서비스를 동적으로 호출하여 인스턴스를 조회하고 로드 밸런싱을 수행하는 HTTP 클라이언트이다.
Ribbon
Eureka에서 서비스 인스턴스 목록을 제공받아 로드 밸런싱을 수행한다. 요청 실패 시 다른 인스턴스로 자동 전환되도록 구성한다.
로드 밸런싱 알고리즘
- 라운드 로빈: 순차적으로 요청을 분배한다.
- 가중치 기반: 가중치에 비례하여 요청을 분배한다.
- 최소 연결: 현재 연결된 클라이언트 수가 적은 서버로 요청을 보낸다.
- 응답 시간 기반: 응답 시간이 가장 빠른 서버로 요청을 전송한다.
Feign Client와 Ribbon 동작 원리
@FeignClient(name = "my-service")
어노테이션으로 서비스 이름을 참조한다.- Eureka 서버에서 해당 이름으로 등록된 서비스 인스턴스 목록을 조회한다.
- Ribbon을 사용해 로드 밸런싱으로 인스턴스를 선택한다.
- 설정된 알고리즘에 따라 요청이 분배된다.
@FeignClient(name = "my-service")
public interface MyServiceClient {
@GetMapping("/endpoint")
String getEndpointData();
}