[Spring Cloud] Microservice(MSA) 구축 : (1) MSA의 이해와 Spring Cloud의 구조
마이크로서비스 아키텍처 (Microservices Architecture, MSA)
비즈니스 로직을 분리하여 개발하고, 분리된 서비스가 다른 서비스에 영향을 최소화하여 개발하는 방법론. 작은 서비스들이 모여 단일 어플리케이션을 이룬다.
소프트웨어를 작은, 독립적인 서비스 단위로 나누는 방식으로 설계된다. 이러한 독립적인 마이크로서비스는 각각 자체 실행 가능하며, 특정 기능 또는 업무를 처리한다. 다른 마이크로서비스와 통신하여 전체 시스템을 구성하게 된다.
1. 낮은 서비스 간의 결합도
각 서비스는 독립적으로 개발, 배포, 확장될 수 있다. 최소한의 중앙집중식 시스템을 유지하며, 분산 시스템을 구축한다.
2. 독립된 기술 스택과 데이터 스토리지
독립적으로 어떤 기능에 충실하여 개발하게 되므로, 굳이 같은 기술 스택을 사용하지 않고 Spring, Node.js, ASP.NET 등 각각 다른 프레임워크를 통해 개발할 수 있으며, 이에 따른 데이터 스토리지도 공유하지 않고 각각 운영하여 의존성을 낮추고 낮은 결합도를 가질 수 있다.
그렇지만 데이터베이스의 공통 관심 영역, 즉 여러 마이크로서비스가 동일한 비즈니스 엔터티를 조작하고 서로 간의 일관성을 유지해야 하는 경우 데이터 동기화가 필요할 수 있다. 이 때 Apache Kafka 등 메시지 브로커를 이용하게 된다.
3. 여러 개의 서비스 인스턴스
각각의 비즈니스 로직을 담당하는 서비스 인스턴스들이 여러 개가 생성되어 운영된다.
트래픽 처리를 위해서 같은 비즈니스 로직을 처리하는 인스턴스 또한 여러 개 생성할 수 있다.
예를 들어 "고객 로직 처리 서버(Spring)"와 "매장 로직 처리 서버(Node.js)"의 인스턴스가 각각 N개씩 서로 다른 IP와 포트에서 동작할 수 있다는 것이다.
4. 스케일 아웃(Scale out)
서비스의 부하에 따라 수평적으로 서비스 인스턴스를 확장하거나 축소할 수 있다.
5. Service Discovery (Naming Server)
- 각각의 인스턴스들의 IP와 포트 주소를 일일이 관리하기는 어려운 작업이며, IP와 Port가 변경되고, 인스턴스가 수시로 추가되거나 제거될 수 있다. MSA에서는 동적인 환경에서 여러 개의 서비스 인스턴스를 관리해주는 Naming Server의 역할이 필요하다.
- Service Discovery는 각 서비스 인스턴스들을 추가 혹은 제거하고, 검색 및 Health Check(상태 추적)의 기능을 한다. 이를 통해 클라이언트가 서비스에 접근할 때 필요한 정보를 제공한다.
6. Gateway와 Load Balancer
Gateway : 클라이언트는 단일 진입점을 통해서 MSA의 인스턴스들에 접근 가능하며, Gateway는 Naming Server에 등록된 인스턴스의 정보를 기반으로 클라이언트의 요청을 라우팅해주는 역할을 한다.
Load Balancer : 서비스의 트래픽을 여러개로 분산된 인스턴스에 나누어 주는 역할을 수행한다. Load Balancer의 역할은 서비스 인스턴스의 상태를 모니터링하고, 이를 기반으로 트래픽을 분산시킨다.
7. CI/CD
여러개의 서비스 인스턴스를 운용해야 하므로 일일이 패키징/빌드/배포하는 과정은 매우 오래 걸리고 번거로운 작업이다.
따라서 자동화된 배포 시스템(CI/CD)을 사용하여 빠르게 변경사항을 배포한다.
Spring Cloud 아키텍쳐
Spring Cloud는 분산 시스템과 MSA를 쉽게 개발하고 구축하기 위한 Spring 기반의 프레임워크 모음이다.
Spring Cloud는 다양한 분산 시스템 문제에 대한 해결책을 제공하며, 여러 서비스로 구성된 복잡한 시스템을 쉽게 관리하고 확장할 수 있도록 지원한다
Spring Cloud API Gateway
마이크로서비스 아키텍처에서 Gateway로서 클라이언트의 단일 진입점 역할을 하는 서버 역할을 한다.
인증, 권한 부여, 로드 밸런싱, 라우팅, 트래픽 제어 등의 기능을 제공한다.
클라이언트는 API Gateway를 통해 여러 서비스에 대한 요청을 보내고, API Gateway는 이를 해당 서비스로 라우팅해준다.
Spring Cloud Config Server
설정 관리를 중앙에서 효과적으로 관리할 수 있게 해주는 서버 역할을 한다.
각 마이크로서비스는 Config Server를 통해 자체적인 설정을 동적으로 가져올 수 있으며 설정의 중앙 집중 관리로 유지보수 및 변경 관리를 용이하게 한다.
Spring Service Registry (Naming Server)
MSA에서 서비스 인스턴스의 등록과 검색을 담당하는 서버 역할을 한다.
서비스 인스턴스의 등록과 해제를 관리하며 서비스 디스커버리를 통해 클라이언트는 특정 서비스 인스턴스를 동적으로 찾을 수 있.
대표적인 예로는 Netflix Eureka
Distributed Tracing
마이크로서비스 아키텍처에서 여러 서비스 간의 트랜잭션을 추적하고 모니터링하는 기술
대표적인 도구로는 Zipkin이나 Jaeger