MSA란 애플리케이션을 느슨히 결합된 작은 여러 서비스로 구조화하는 서비스 지향 아키텍쳐 스타일의 일종인 소프트웨어 개발 기법이다.
한 시스템에 여러 서비스가 통합되어 있는 모놀리식 아키텍처는 서비스의 변경이 어렵고, 배포에도 오랜 시간이 소요되었다. 이러한 문제점을 보완하기 위해 MSA가 등장하게 되었다.
MSA는 애플리케이션의 이해, 개발, 테스트를 더 쉽게하며 서비스마다 독립적으로 개발, 배포할 수 있다. 마이크로 서비스들은 각각 비즈니스 계층과 데이터베이스를 가지고 있어 서로 영향을 주지 않으며 각 서비스들은 API를 통해 상호작용한다.
분산 시스템 구성에 필요한 다양한 기능을 제공하는 Spring Boot 기반 프레임워크로 MSA를 지원한다.
Spring Config
별도의 통합된 설정 관리 서비스 제공을 통해 환경 독립적 서비스 제공
분산시스템에서 애플리케이션의 환경설정 정보를 분리해 외부에서 관리하도록 한 환경설정 서버
Eureka(Spring Clud Netflix)
서비스의 논리적 위치 정보 제공
필요한 서비스의 자가 등록, 탐색 및 부하 분산에 사용될 수 있는 라이브러리
마이크로 서비스들의 정보를 레지스트리 서버에 등록할 수 있도록 한다.
- Eureka Server : 마이크로 서비스들의 상태 정보가 등록되어 있는 레지스트리 서버
- Eureka Client : 서비스가 시작될 때 Eureka 서버에 등록하고 이후 주기적으로 자신의 상태를 알리며, 일정 횟수 이상의 ping이 확인되지 않으면 Eureka 서버에서 해당 서비스를 제외시킨다.
Spring Cloud Bus(AMQP & RabbitMQ)
분산 메세징 지원을 위한 서비스 연계 지원
Config 서버의 설정 값이 변경될 경우, 마이크로서비스들이 변경된 설정 값을 갱신하기 위해서는 서비스를 재시작하거나 /actuator/refresh를 호출해주어야 한다. 하지만 서비스가 많을 경우 각각을 해주기 쉽지 않으므로 마이크로서비스들에게 refresh를 수행하라는 메시지를 Config 서버에 전송해야한다. 이 메시지를 전송해주는 컴포넌트를 메시지브로커라고 하며 RabbitMQ, Kafka가 대표적이다.
Hystrix(Spring Cloud Netflix)
서비스 간 호출 시, 문제가 있는 서비스에 대한 차단 지원 서비스
MSA 사용 시 App의 장애 전파를 방지할 수 있다.
Ribbon(Spring Cloud Netflix)
서비스 호출 시, 분산 형태로 호출할 수 있는 client 적용 서비스 라이브러리
MSA에서 Client에 탑재할 수 있는 Load Balancer이다.
분산 처리 방법으로 여러 서버를 라운드 로빈 방식(기본 설정)으로 부하 분산 기능을 제공한다.
API Gateway - Zuul(Spring Cloud Netflix)
모든 클라이언트 요청에 대한 end-point를 통합하는 서비스
인증 및 권한 ,모니터링, logging 등의 기능도 지원한다.
서비스 호출 시, routing을 통해 실제 서비스에 위치 제공
ex) port 하나로 catalog, customer 둘 다 접속 가능
Spring Cloud Cluster
서비스 레벨의 Cluster를 지원하기 위한 서비스 제공
Spring Cloud Security
Load balanced 환경에서의 OAuth2.0 인증 지원 서비스
Spring Cloud Sidecar
non-JVM 프로그래밍 언어 지원을 위한 서비스
Spring Cloud Kubernetes
Spring Cloud 애플리케이션을 위한 쿠버네티스 Discovery와 ConfigMaps 지원 서비스