Spring Boot - MSA 필수 구성요소
1. 서비스 간 통신방법
HTTP 요청
- 한 서비스가 다른 서비스에 HTTP 요청을 보내면, 요청을 처리하여 응답을 반환할 때까지 기다리는 동기적인 요청 처리방식이다.
- 서비스의 응답이 다른 서비스의 작업에 영향을 미치기 때문에 서비스 간 결합도가 높아질 수 있다. (e.g. REST API, GraphQL, WebSocket)
비동기 메시징
- 한 서비스가 다른 서비스에 메시지를 보냈을 때, 응답을 기다리지 않고 바로 다음 작업을 진행하는 것을 의미한다.
- 주로 메시지 브로커를 사용하여 메시지를 전달하여 각 서비스가 독립적으로 동작할 수 있게한다. (e.g. RabbitMQ, Apache Kafka)
2. API Gateway
클라이언트 요청을 처리하고 적절한 서비스로 라우팅해주기 때문에 클라이언트는 여러 서비스로부터 한번의 요청으로 데이터를 받을 수 있다. 또한, 인증 및 권한 부여와 로깅 및 모니터링을 중앙에서 기록하고 관리하기 때문에 클라이언트가 개별 서비스의 상태를 신경쓸 필요가 없다.
Spring Cloud Gateway
- Spring WebFlux를 기반으로 하여 비동기 처리에 최적화되어 있다.
- 라우팅 및 필터링을 코드와 설정파일 모두에서 정의할 수 있어 유연한 구성이 가능하다.
Zuul
- Netflix에서 제공하는 API Gateway로 Legacy 시스템과의 호환성에 유리하다.
- 복잡한 라우팅 규칙과 필터링 기능을 제공하지만, Spring Cloud Gateway에 비해 성능이 떨어질 수 있다.
3. 서비스 발견
MSA에서 각 서비스의 위치 (IP주소, 포트)를 동적으로 찾는 프로세스를 의미하며, 각 서비스가 서로를 쉽게 발견하고 통신할 수 있도록 도와준다.
Netflix Eureka
- Netflix에서 제공하는 서비스 등록 및 발견 시스템으로 각 서비스가 시작될 때 Eureka 서버에 자신을 등록하고, 다른 서비스는 이 정보를 통해 해당 서비스를 찾는다.
- 동적인 서비스 인스턴스 관리가 가능하며, 로드 밸런싱을 사용할 수 있다. (로드 밸런싱 : 네트워크 트래픽을 여러 서버나 인스턴스에 고르게 분산하여, 특정 서버에 과부하가 걸리는 것을 방지하고 전체 시스템의 성능과 가용성을 향상시키는 기술)
Consul
- HashiCorp에서 개발한 서비스 발견 및 구성 관리 시스템으로 분산 시스템에 최적화되어 있다.
4. 보안
Spring Security
- 인증 및 권한 부여를 처리하는 보안 프레임워크로 OAuth2, JWT 등 다양한 인증 메커니즘을 지원하여 서비스 보안을 강화할 수 있다.
5. 데이터 관리
데이터베이스 분리
- 각 마이크로서비스는 독립적인 데이터베이스를 가져야 하며, 데이터베이스 간의 결합을 피해야한다.
API 기반의 데이터 접근
- 다른 서비스의 데이터에 접근할 때 직접 데이터베이스를 호출하지 않고 API를 통해 접근하도록 설계해야한다.
Spring Cloud Config
- 각 서비스가 개별적으로 관리하는 설정을 중앙에서 관리하기 위해 사용한다. 모든 서비스의 설정 파일을 외부 저장소(e.g. Git, 파일 시스템 등)에 저장하고, 필요한 서비스가 이를 가져오도록 한다.
6. 컨테이너화/오케스트레이션 및 배포
Docker
- 각 마이크로서비스를 독립적인 컨테이너로 패키징하여 배포 및 관리를 용이하게 해준다.
Kubernetes
- 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링, 관리하는 오케스트레이션 플랫폼이다.
컨테이너화
- 정의
: 애플리케이션과 의존성을 하나의 패키지로 묶어 컨테이너로 실행할 수 있도록 하는 과정을 말한다.
- 목적
: 애플리케이션이 어느 환경에서든 동일하게 실행될 수 있도록 보장하여 이식성을 높이고, 개발환경과 운영환경의 차이를 줄인다. 주로 단일 애플리케이션을 여러 환경에 배포하거나 단순한 멀티 컨테이너 환경에서 사용한다.
- 도구
: Docker
오케스트레이션
- 정의
: 여러 컨테이너와 서비스를 조정하고 관리하는 프로세스로, 컨테이너의 배포 및 확장, 로드 밸런싱, 서비스 발견, 상태 모니터링 등의 작업을 자동화한다.
- 목적
: 복잡한 분산 시스템의 관리와 조정을 용이하게 하여 장애 발생시 자동 복구를 지원하고, 자원의 효율성을 극대화한다. 주로 여러 컨테이너로 구성된 복잡한 애플리케이션이나 MSA를 운영할 때 사용한다.
- 도구
: Kubernates, Docker Swarm, Apache Mesos
7. 모니터링 및 로깅
Spring Actuator
- SpringBoot 애플리케이션의 상태 및 메트릭을 모니터링할 때 사용한다.
ELK Stack
- 로그 수집 및 분석을 위한 스택으로 다양한 서비스에서 수집된 로그를 중앙에서 관리하고 시각화할 수 있다.
Spring Boot - MSA 구축 흐름
1. 서비스 설계 및 API 정의
- 서비스 역할 및 경계 설정
: 각 마이크로서비스의 기능을 독립적으로 정의하여 서비스 간의 명확한 경계를 설정한다.
- 서비스 간 통신 및 API 설계
: RESTful API 또는 비동기 메시지 기반의 통신방식을 통해 서비스 간 데이터 교환을 위한 API를 정의한다.
2. 라이브러리 설정
- Spring Cloud 라이브러리 설정
: Service Discovery, API Gateway, 외부 설정 관리 등 마이크로서비스 간 상호작용을 지원하는 라이브러리를 설정한다.
3. 서비스 개발 및 테스트
- 통신코드 작성
: 서비스 간의 통신방식을 고려하여 REST API 또는 메시지 큐 통신 로직을 작성한다.
- 테스트
: Mock API 또는 Feign Client를 이용한 단위 및 통합 테스트를 수행하여 각 서비스가 독립적이고 상호작용적으로 잘 동작하는지 검증한다.
4. 컨테이너화 및 오케스트레이션
- 컨테이너화
: Docker를 통해 각 서비스를 컨테이너 이미지로 패키징하여 환경 일관성을 보장한다.
- 오케스트레이션 설정
: Kubernates 또는 Docker Swarm을 통해 컨테이너화된 서비스의 자동 복제와 리소스 할당 등을 관리한다.
5. CI/CD 파이프라인 구축
- 자동화된 빌드 및 배포
: Jenkins, GitLab, GitHub Actions 등을 통해 '빌드-테스트-배포' 파이프라인을 자동화하여 코드가 변경될 때마다 빠르게 반영되도록 설정한다.
6. 배포 및 배포 전략
- 배포방식 선택
: 각 서비스의 안정성과 확장성을 고려하여 Docker Compose 또는 Kubernates 등의 배포 방식을 선택한다.
- 배포 전략
: Blue-Green, Deployment, Canary Deployment 등의 전략을 활용하여 새로운 버전을 배포할 때 서비스 중단을 최소화할 수 있다.
7. 모니터링 및 로깅
- 성능 및 장애 모니터링
: Prometheus, Grafana, ELK Stack 등을 활용하여 성능 및 서비스 상태를 실시간으로 모니터링하고, 장애 발생시 알림을 통해 빠르게 대응하도록 한다.