Software Architecture/MSA

[MSA] 마이크로서비스 아키텍처를 구축하는 기술 (Spring Cloud)

bu119 2024. 3. 11. 09:00
728x90
반응형

MSA를 구축하기 위한  Spring Cloud 프레임워크의 핵심 라이브러리들의 개념을 알아보자.

 

Spring Cloud

Spring Cloud는 스프링 프레임워크에서 분산 시스템인 마이크로서비스 아키텍처(MSA)를 구축할 때 유용한 도구를 제공하는 프레임워크이다. Spring Cloud는 Spring Boot에서 제공하는 기능을 기반으로 분산 시스템에서 필요한 다양한 기능들을 추가로 제공한다.

 

Netflix OSS (Open Source Software)

Netflix에서 개발한 오픈소스 소프트웨어들의 집합으로 클라우드 네이티브 애플리케이션을 만들기 위한 다양한 도구들을 자체적으로 사용하면서 성능이 검증된 라이브러리로 제공한다. 이를 통해서 클라우드 네이티브 애플리케이션 개발과 운영을 보다 쉽고 간편하게 만들어 준다.

 

Netflix OSS에는 다양한 서비스들이 존재한다.

  1. Eureka : Discovery Server
    •  각각의 서비스 인스턴스들이 동적으로 확장, 축소되더라도 인스턴스의 상태를 하나의 서비스로 관리할 수 있는 서비스
  2. Hystrix : Circuit Breaker
    • 특정 서비스가 과부하가 걸려 서비스 장애를 전파하는 특성을 해결하려는 기능
  3. Ribbon : Client Side Load Balancer
    • 부하 분산을 위한 모놀리스의 L4 스위치와 같이 트래픽을 분산시키는 기능
  4. Zuul : API Gateway
    • 각각의 마이크로서비스의 종단점을 연결하는 리버스 프록시
  5. EvCache
  6. Spectator
  7. Archaius

하지만, 이런 서비스들이 모두 Spring Cloud에서 사용되는 것은 아니다.

 

 

MSA 구축을 위한 주요 라이브러리

 

Spring Cloud Netflix

Spring Cloud Netflix는 Spring Boot Application에 대한 통합 환경 구성을 지원하는 Netflix의 OSS 서비스이다.

이름 분류 설명
Eureka 서비스 디스커버리 도구 각각의 서비스 인스턴스들을 등록하고 관리하는 역할을 합니다.
Hystrix 서킷 브레이커 패턴 라이브러리 서비스 간의 의존성을 관리하고 서비스 장애 시에도 전체 시스템의 안정성을 유지할 수 있습니다.
Ribbon 클라이언트 측 로드 밸런싱 라이브러리 여러 개의 인스턴스 중에서 가장 적은 부하를 가진 인스턴스를 선택하여 요청을 보내는 역할을 합니다.
Zuul API 게이트웨이 클라이언트와 서비스 사이에서 라우팅, 필터링, 보안 등의 역할을 수행합니다.

 

Netflix는 2007년 심각한 DB손상으로 3일간 서비스 장애를 겼었는데, 이에 운영진들과 기술 리더들은 신뢰성 높고 수평확장이 가능한 Cloud System으로 이전을 해야 함을 느꼈었다고 한다. 그리고 결국 MSA를 7년 만에 완벽하게 이전하게 되었는데, 이때 쌓은 경험치를 바탕으로 MSA 기술을 Spring에게 오픈소스로 풀게 되었다.

 

Spring Cloud Architecture 구성요소(Component)

Spring Cloud Architecture

 

Miscroservices

실제 서비스(도메인)를 제공하는 Spring Boot 서버이다.

 

API Gateway (Spring Cloud Netflix Zuul)

여러 개의 마이크로서비스에서 제공하는 API를 단일 진입점으로 노출시켜 주는 역할을 한다.

스프링 클라우드는 Netflix OSS의 Zuul, Spring Cloud Gateway 등 다양한 API 게이트웨이를 제공한다.

  • 모든 클라이언트 요청에 대한 end-point를 통합하는 서비스
  • 인증 및 권한, 모니터링, logging 등의 기능도 지원
  • 서비스 호출 시, routing을 통해 실제 서비스에 위치 제공
  • ex) port 하나로 catalog, customer 둘 다 접속 가능

 

Config Server (Spring Cloud Config)

Spring Cloud Config는 설정 외부화를 위한 프로젝트로, 설정 정보를 저장하고 제공하는 서버를 구축한다.

즉, 분산시스템에서 애플리케이션의 환경설정 정보를 분리해 외부에서 관리하도록 한 환경설정 서버이다.

  • 마이크로서비스에서 필요한 설정 정보를 중앙에서 관리 (중앙 집중식)
  • 변경사항을 런타임 중에 적용 가능 (손쉽게 수정하고 배포)
  • 각 클라이언트는 설정 서버로부터 설정 정보를 조회

 

Service Discovery (Spring Cloud Netflix Eureka)

Spring Cloud Netflix Eureka는 Service Discovery Pattern을 위한 프로젝트로, Eureka Server와 Eureka Client로 구성되어 있다. (로드 밸런싱, 장애 조치 등등)

  • Eureka Server : 마이크로 서비스들의 상태 정보가 등록되어 있는 레지스트리 서버
  • Eureka Client : 서비스가 시작될 때 Eureka 서버에 등록하고 이후 주기적으로 자신의 상태를 알리며, 일정 횟수 이상의 ping이 확인되지 않으면 Eureka 서버에서 해당 서비스를 제외시킨다.

 

서비스 디스커버리는 분산 시스템에서 서비스 인스턴스의 위치와 상태를 검색하고 사용할 수 있는 기능이다. 즉, 마이크로서비스 환경에서 서비스를 검색하고 호출하기 위한 기능이다.

스프링 클라우드는 Netflix OSS의 Eureka, Apache ZooKeeper, Consul 등 다양한 서비스 디스커버리 툴과 통합되어 있다.

  • 서비스의 논리적 위치 정보 제공
  • 필요한 서비스의 자가 등록, 탐색 및 부하 분산에 사용될 수 있는 라이브러리
  • 마이크로서비스들의 정보를 레지스트리 서버에 등록할 수 있도록 한다.

 

Spring Cloud Netflix Hystrix

MSA 환경에서는 장애가 큰 이슈가 되기도 한다.

 

Spring Cloud Netflix Hystrix는 장애가 일어났을 때, 한 서비스의 장애가 다른 서비스로 전파되지 않도록 사전에 차단해 주는 것이다.

 

Distributed Tracing (Spring Cloud Sleuth & Zipkin)

분산 시스템에서의 트랜잭션 추적을 위한 기능이다. 스프링 클라우드는 분산 추적을 위한 Spring Cloud Sleuth와 Zipkin을 제공한다. 마이크로 서비스 아키텍처를 사용하여 구축된 애플리케이션의 프로파일링 및 모니터링에 사용되는 방법이다. 분산 트레이스를 사용하면 장애가 발생하는 장소와 성능 저하를 일으키는 원인을 정확하게 파악할 수 있다. 요청(request)과 메시지를 추적할 수 있어서, 해당 로그와 연관시켜 볼 수 있고 트레이스 정보를 외부 시스템으로 추출하여 '지연시간(latency)'를 시각화할 수도 있다.

 

Spring Cloud Sleuth

  • MSA환경에서 클라이언트의 호출은 내부적으로 여러 마이크로서비스를 거쳐서 일어나기 때문에 추적이 어렵다. 때문에 이를 추적하기 위해서는 연관된 ID가 필요한데, 이런 ID를 자동으로 생성해 주는 것이 Spring Cloud Sleuth이다.
  • 스프링 클라우드 프로젝트는 유입되는 HTTP 요청을 상관관계 ID라고 알려진 추적 ID(traceID)로 측정한다. 이 작업을 위해 필터를 추가하고 다른 스프링 컴포넌트와 상호작용하여 생성된 상관관계 ID를 모든 시스템에 호출한다.

Zipkin

  • Zipkin은 분산 환경에서 로그 트레이싱하는 오픈소스로 트위터에서 개발되었으며, 현재 가장 활성화된 오픈소스다.
  • Zipkin으로 추적할 수 있는 분산 트랜잭션은 HTTP, gRPC가 있다.
  • 여러 서비스 간의 트랜잭션 흐름을 보여 주는 오픈 소스 데이터 시각화 도구이다.
  • Zipkin을 사용하면 트랜잭션을 컴포넌트별로 분해하고 성능 병목점을 시각적으로 확인이 가능하다.

 

Spring Cloud Stream 또는 kafka 또는 RabbitMQ

MSA에서는 Event driven 아키텍처를 많이 권장하는데 서비스 간의 결합도를 많이 줄일 수 있기 때문이다.

 

Spring Cloud Stream는 Event driven MSA를 구축하기 위한 프로젝트로,
비즈니스 로직(코드)을 거의 변경하지 않고 의존성과 설정의 변경만으로 쉽게 연동할 수 있는 프로젝트를 제공해 준다.
또한, 마이크로 서비스들 사이의 통신을 비동기적으로 도와주는 메시지 큐인 kafka와 RabbitMQ가 Spring Cloud Stream과 같이 자주 쓰인다.

  • 데이터 중심 애플리케이션을 단독으로 빌드하고, 테스트하고 배포할 수 있다.
  • 메시지 구성 요소에 모던한 마이크로 아키텍처 패턴을 적용할 수 있다.
  • 이벤트 중심적 사고에서 애플리케이션 간의 책임을 분리할 수 있다. 각 서버의 노드는 이벤트의 원본 발행자를 신경 쓰지 않고 이벤트를 소비할 수 있다.
  • 비즈니스 로직을 Kafka 나 RabbitMQ에 연결할 수 있다.
  • 프레임워크가 제공하는 Content-Type 서포트나 데이터 타입 변경 등을 자유롭게 사용할 수 있다.

 

Spring Cloud Bus (AMQP & RabbitMQ)

Spring Cloud Bus는 마이크로서비스를 메시지브로커 과 연결해 주는 역할과 상태 및 구성에 대한 변경사항을 연결된(메시지브로커와) 모든 마이크서비스에게 전달(broadcast방식) 해주는 프레임워크이다. 즉, 동적으로 config 변경을 적용하기 위한 MQ(Message Queue) Handler입니다.

  • MQ(Message Queue)에 Publisher(=config server)와 Subscriber를 등록
  • config 변경 정보를 MQ에 전송
  • 각 마이크로서비스에서 config 동적 반영

예를 들어, Config 서버의 설정 값이 변경될 경우, 마이크로서비스들이 변경된 설정 값을 갱신하기 위해서는 서비스를 재시작하거나 /actuator/refresh를 호출해주어야 한다. 하지만 서비스가 많을 경우 각각을 해주기 쉽지 않으므로 마이크로서비스들에게 refresh를 수행하라는 메시지를 Config 서버에 전송해야 한다. 이 메시지를 전송해 주는 컴포넌트를 메시지브로커라고 하며 RabbitMQ, Kafka가 대표적이다.

 


참고 자료

https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Config4-Spring-cloud-bus-MSA6

https://velog.io/@minwest/MSAMicroService-Architecture

https://velog.io/@boo105/MSA-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Spring-Cloud

https://adjh54.tistory.com/207#2)%20Spring%20Cloud-1

https://spring.io/cloud

https://enjoy-dev.tistory.com/10

728x90
반응형