SpringBoot

[SpringBoot] Spring Cloud 이해하기

DoMyBestForDeveloper 2026. 1. 24. 02:19

Cloud Native Application

클라우드 네이티브 애플리케이션

  • 클라우드 환경에서 최적화된 방식으로 설계, 개발 및 배포된 애플리케이션을 의미
  • 이렇게 구성된 애플리케이션은 클라우드의 장점을 최대한 활용해 높은 가용성, 확장성, 유연성 및 탄력성을 제공함

 

특징

특징 설명
마이크로서비스 아키텍처 애플리케이션을 작은 단위의 마이크로서비스로 분리해 개발하고 각각의 서비스는 독립적으로 배포와 확장이 가능함
컨테이너화 애플리케이션을 컨테이너에 담아 배포하면 환경에 관계없이, 동일한 동작을 보장할 수 있음.
또한, 컨테이너는 가볍고 빠르게 배포가 가능하며, 확작성도 높음
자동화 애플리케이션의 배포, 확장, 관릳 등의 과정을 자동화하여 인프라 운영 비용을 줄이고, 안정적인 서비스 운영이 가능함
가상화 가상화 기술을 이용해 "애플리케이션"과 "인프라"를 분리하고, 필요에 따라 자원을 할당하거나 회수할 수 있음

 

클라우드 네이티브 12가지 요소

  • 클라우드 네이티브 애플리케이션의 개발과 운영을 위한 원리로 애플리케이션을 확장 가능하고 유지보수가 용이하도록 만들어주는 원칙을 의미함
요소 설명
코드베이스 버전 관리 시스템(Git)을 이용해 단일 코드베이스를 유지
종속성 어플리케이션의 종속성을 명확하게 정의하고, 빌드와 실행 환경에서 분리
구성 어플리케이션 구성 정보를 관리하며, 환경 변수를 통해 설정
백엔드 서비스 백엔드 서비스는 분리된 자원으로 관리하며, URL을 통해 연결
빌드, 릴리즈, 실행 빌드와 릴리즈 단계를 분리하고, 어플리케이션 실행 환경을 명확하게 구분
프로세스 어플리케이션을 하나 또는 여러 개의 stateless 프로세스로 실행하며, 프로세스는 동일한 방식으로 처리됨
포트 바인딩 어플리케이션은 포트를 통해 외부와 통신하며, 어플리케이션의 포트는 환경변수를 통해 설정함
동시성 프로세스를 병렬로 실행해 확장성을 보장하며, 프로세스 간의 공유 데이터는 분리된 자원으로 관리함
격리 어플리케이션과 어플리케이션 실행 환경을 분리해, 상호 영향을 최소화함
로그 어플리케이션 이벤트를 로그로 기록하며, 로그는 환경변수를 통해 설정
관리 프로세스 어플리케이션 실행 환경에서 관리 프로세스를 분리하여, 어플리케이션의 상태를 관리함
배포 어플리케이션은 언제든지 자동화된 배포 과정을 통해 배포 가능해야 함

 

 

Spring Cloud

  • 스프링 프레임워크에서 분산 시스템인 마이크로서비스 아키텍처(MSA)를 구축할 때 유용한 도구를 제공하는 프레임워크
  • RAD(Rapid Application Development) 방법론을 채택하여 스프링 프레임워크가 같이 자바 기반으로 개발되며 클라우드 환경에서의 빠르고 안정적인 애플리케이션 개발을 위한 여러 기능을 제공함
  • 주요 기능으로는 서비스 디스커버리, 로드밸러닝, 구성 관리, 회로 차단, 분산 추적 등이 있음
RAD(Rapid Application Development)란?
- 개발 방법론 중 하나로 빠르게 애플리케이션을 개발하기 위한 방법론
- 개발 생명주기의 단축과 빠른 프로토타이핑을 통한 빠른 시장 출시를 목표로 함

Spring Cloud는 왜 RAD 방법론을 사용하는가?
- Spring Cloud에서는 서비스 디스커버리, 로드밸런싱, 구성 관리, 회로 차단, 분산 추적 등의 기능을 제공하여 개발자가 집중해야 할 핵심 비즈니스 로직에 더욱 집중할 수 있도록 도와주기에 RAD 방법론을 사용

 

 

모놀리식 아키텍처 (Monolithic Architecture: MA) vs 마이크로 서비스 아키텍처(Micro Service Architecture: MSA)

  • 모놀리식 아키텍처:애플리케이션을 하나의 서비스 혹은 애플리케이션이 '하나의 통합된 구조'를 갖는 것을 의미함
  • 마이크로 서비스 아키텍처: 하나의 애플리케이션을 '독립적으로 배포 가능한 서비스 단위'로 분할하여 서로 간의 변경과 조합이 가능하도록 이루는 구조를 갖는 것을 의미
분류 모놀리식 아키텍처(Monolithic Architecture) 마이크로 서비스 아키텍처(Micro Service Architecture)
설명 모든 서비스를 단일 어플리케이션에 통합 서비스를 작은 단위로 분리해 독립적으로 배포하고 운영함
배포 '전체' 어플리케이션 배포 필요 '필요한 부분'만 배포 가능
확장성 '수직 확장'만 가능: Scale-In '수평 확장' 가능: Scale Out
개발 방식 단일 코드 베이스 독립적인 코드 베이스
유지보수 전체 어플리케이션을 수정해야 함 각 서비스를 독립적으로 수정 가능
복잡성 쉽게 이해할 수 있음 분산 시스템으로 인한 복잡성
테스트 전체 애플리케이션 테스트 필요 각 서비스를 독립적으로 테스트 가능
데이터 관리 중앙 집중식 데이터 관리 서비스 간 데이터 공유 어려움
장애 처리 전체 시스템 다운 일부 서비스만 다운되므로 장애 발생 시 영향 최소화 가능

 

수직 확장(Scale-In)
- 서버의 성능을 향상하는 것으로 단일 서버에 더 많은 하드웨어 자원을 추가하는 것

수평 확장(Scale-Out)
- 서버의 용량을 늘리는 것으로 '서버 인스턴스'를 추가해 부하를 분산시키는 것

 

Spring Boot vs Spring Cloud

  • Spring Boot와 Spring Cloud는 모두 Spring Framework 기반으로 개발되었지만, 각각의 목적과 기능의 차이가 존재
  • Spring Boot는 단일 애플리케이션 개발을 위한 프레임워크이며, Spring Cloud는 분산 시스템의 개발 및 운영을 위한 프레임워크임
  • Spring Cloud는 Spring Boot에서 제공하는 기능을 기반으로 분산 시스템에서 필요한 다양한 기능들을 추가로 제공
  • Spring Cloud라는 환경아래에 각각의 단일 애플리케이션은 Spring Boot를 이용해 개발
분류 Spring Boot Spring Cloud
프레임워크 종류 단일 서비스 개발을 위한 프레임워크 분산 시스템 개발을 위한 프레임워크
장점 빠른 개발과 배포, 간단한 설정, Spring 기반으로 다양한 라이브러리 지원 분산 시스템 개발에 필요한 다양한 기능 제공, 클라우드 네이티브 애플리케이션 개발에 적합
단점 대규모 분산 시스템에서는 한계가 있음(서비스 간의 통신, 관리 등의 기능이 부족) 설정이 복잡하고 러닝커브가 높음
주요 모듈 Spring MVC, Spring Data, Spring Security, Spring Boot Acuator Spring Cloud, Config, Discovery, Routing, Circuit Breaker, Messing

 

Netfix OSS(Neflix Open Source Software)

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

Netfix OSS 제공 주요 도구

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

 

 

Spring Cloud 특징

  1. 분산/버전 구성(Distributed/versioned configuration): Spring Cloud Config
  2. 서비스 등록 및 검색(Service registration and discovery): Spring Cloud Discovery
  3. 서비스 간 호출(Service-to-service calls): Spring Cloud Discovery
  4. 라우팅(Routing): Spring Cloud Routing
  5. 로드 밸런싱(Load balancing): Spring Cloud Routing
  6. 서킷 브레이커(Circuit Breakers): Spring Cloud Circuit Breaker
  7. 글로벌 락(Global locks) & 지도자 선출, 클러스터 상태(Leadership election and cluster state): Spring Cloud Config
  8. 분산 메시징(Distributed messaging): Spring Cloud Messaging

 

1. 분산/버전 구성(Distributed/versioned configuration): Spring Cloud Config

  • Spring Cloud는 분산 시스템에서 구성 데이터를 효과적으로 관리하기 위한 분산/버전 구성 기능을 제공함. 이를 통해 시스템 구성 요소의 동적인 변경과 관리가 가능해짐
  • Spring Cloud에서는 분산/버전 구성을 위해 Spring Cloud Config 컴포넌트를 사용함
  • 설정 파일을 Git 저장소, 파일 시스템, Vault 등을 이용해 관리할 수 있음

분산/버전 구성 동작 비교

  • Spring Boot 환경에서는 같은 단일 애플리케이션의 경우는 애플리케이션이 동작할 때 "설정 파일"을 읽어와서 수행함
  • Spring Cloud 환경에서는 MSA를 지원할 때에는 환경 자체의 값들을 자유롭게 변경, 처리할 수 있어야 함. 그렇기에 중앙 저장소(Spring Cloud Config Server)에서 모든 설정갑을 관리하고 개별 서비스는 중앙 저장소에 요청해 가져오는 형태로 사용됨
종류 설명
Spring Config Server 구성 정보를 저장하고 관리하는 중앙 집중식 서버를 의미
Spring Config Client Config Server로부터 구성 정보를 가져와서 애플리케이션의 환경 정보를 설정함

 

설정 관리 방법

  • 최초 애플리케이션(Web/Mobile/IoT)에서 구동 시 서비스 요청이 되며 서비스는 Config Server로 요청하여서 Git Repository로부터 설정 정보를 요청 및 응답을 받아서 서비스의 설정 파일을 구성

 

1. 분산 구성(Distributed Configuration)

  • 분산 시스템에서 애플리케이션의 '설정 정보를 중앙 집중적으로 관리'할 수 있는 기능. 이를 통해 애플리케이션의 설정 정보를 변경하더라도 애플리케이션을 재시작할 필요 없이 변경된 설정 정보를 즉시 반영할 수 있음
  • Spring Cloud에서는 분산 구성을 위해 'Cloud Config Server'를 사용함. 이를 통해 설정 정보를 중앙 집중적으로 관리하고, 다른 애플리케이션에서 설정 정볼르 가져와 사용할 수 있음
설정 관리 방법: 설정 파일을 불러오는 과정
1. 클라이언트에서 최초 구동 시 서비스로 요청함
2. 서비스는 '설정 정보'를 Config Server로 요청
3. Config Server는 Git Repository로 설정 정보를 찾아서 반환받음
4. Config Server는 찾은 '설정 정보'를 서비스로 전달함

 

 

2. 버전 구성(Versioned Configuration)

  • 애플리케이션의 설정 정보를 버전 관리할 수 있는 기능임. 이를 통해 설정 정보의 변경 이력을 관리하고, 필요한 경우 이전 버전의 설정 정보로 되돌릴 수 있음
  • 버전 구성을 위해 Git 또는 Subversion과 같은 버전 관리 시스템을 사용함. 이를 통해 Git 또는 Subversion에 설정 정보를 저장하고 버전 관리를 할 수 있음
  • 또한, 설정 정보는 Git 브랜치와 태그를 사용해 서로 다른 구성 환경에 대한 구성 파일을 저장할 수 있음
  • 예를 들어 dev 브랜치에는 개발 환경을 위한 구성 파일이 있고, prd 브랜치에는 운영 환경을 위한 구성 파일이 존재

 

2. 서비스 등록 및 검색(Service registration and discovery): Spring Cloud Discovery

  • 분산 시스템에서 서비스 간의 서비스를 등록하거나 검색을 효율적으로 처리하도록 기능을 제공
  • 서비스의 등록은 중앙 저장소(Spring Cloud Config Server)에 등록해 이를 기반으로 하여 검색이 수행됨
  • 이 기능을 이용하면 다수의 서비스 인스턴스를 자동으로 등록하고 검색할 수 있어서, 서비스의 통신을 보다 쉽게 구현할 수 있음. 또한, 해당 등록 시점은 서비스가 실행되면 자동으로 등록이 되며, Discovery Server에 등록 정보(인스턴스ID, 서비스 위치 정보)가 전송됨
서비스 인스턴스
- 분산 시스템에서 실행 중인 서비스(애플리케이션)의 한 인스턴스를 의미. 즉, 서비스 인스턴스는 서비스의 실행 가능한 하나의 단위
- Spring Cloud의 서비스 등록 및 검색 기능을 이용한다면 다수의 서비스 인스턴스를 자동으로 등록하고, 검색할 수 있어 서비스 간의 통신을 보다 쉽게 구현 가능

 

 

1. 서비스 등록

  • 서비스 등록을 위해서 Eureka와 Consul, Apache Zookeeper와 같은 다양한 서비스 디스커버리 클라이언트를 지원함
  • 이를 이용하면 서비스 인스턴스를 자동으로 등록할 수 있음. 등록된 서비스는 클라이언트에서 검색할 수 있으며, 이를 통해 다른 서비스와의 통신을 수행할 수 있음

 

2. 서비스 검색

  • 사전에 등록된 서비스를 검색하기 위해 Discovery Server로 요청하여 서비스에 대한 정보를 반환받음
  • 서비스 반환 정보
    • 서비스 인스턴스의 IP 주소와 포트 번호
    • 서비스 인스턴스가 등록된 서비스 이름
    • 등록된 서비스의 메타데이터
  • 이를 통해 서비스 인스턴스에 직접 요청할 수 있음

 

 

3. 서비스 간 호출(Service-to-Service calls): Spring Cloud Discovery, Spring Cloud Routing 컴포넌트

  • 분산 시스템에서 서비스와 서비스 간의 호출은 빈번하게 발생함. 이를 위해 API Gateway를 통해 서비스를 호출할 수도 있지만, 내부망에서 SSL, 필터링 처리 등 불필요한 부하가 발생함
  • 이를 위해 중앙 저장소(Spring Cloud Config Server)에 사전에 등록된 서비스에 대해서 서비스 간의 데이터를 전달하고 내부적으로 HTTP를 사용해 통신함 
  • 서비스 간의 호출을 위해 Rest Template, Feign, WebClient 기술을 사용해 구성함

 

4. 라우팅(Routing): Spring Cloud Routing

  • 특정 네트워크 내부에서 목적지를 찾아가는 과정을 의미
  • 대표적으로 Spring Cloud Routing에서는 Cloud Load Balancer와 Gateway, OpenFeign이 있음

API 게이트웨이?

  • 클라이언트에서 API로 보내는 요청을 각각의 서비스에 맞게 라우팅 해주는 역할을 수행
  • API Gateway를 사용함으로써 외부에 노출되는 포인트를 하나로 만들어서 관리가 편리해지며 인증 혹은 SSL 처리를 담당해 게이트웨이 내부 모듈을 더 간단하게 만들도록 도와줌
BFF(Backend For Fronted) 패턴
- 클라이언트 측에서 사용하는 모바일 앱 또는 웹 애플리케이션과 같은 프론트엔드에서 백엔드 서비스에 직접 접근하는 것보다 API Gateway와 같은 중간 레이어를 통해 백엔드 서비스를 호출하는 것을 의미
- 이를 사용하면 클라이언트 유형에 대해 별도의 API를 노출하므로 클라이언트 유형에 따라 서로 다른 백엔드 서비스를 호출할 수 있음
- 이에 따라 클라이언트의 요구 사항에 맞게 서비스를 제공할 수 있음

 

Zuul 이용하기: API Gateway

Spring Cloud Zuul이란?

  • Netfix에서 개발한 오픈소스 프로젝트로 클라이언트와 마이크로서비스 간의 인증, 라우팅, 부하 분산 등의 기능을 제공
  • 서비스 디스커버리와 연계하여 동작하며 Eureka, Consul, Zookeeper 등의 서비스 디스커버리 서버를 지원함. 또한, 다양한 필터들을 제공하여 Request/Response에 대한 로그 및 성능 측정, 인증/인가, 헤더 조작 등의 작업을 수행할 수 있음. 
  • 이를 통해 클라이언트 요청을 안정하게 처리하고, 로드밸런싱 및 트래픽 라우팅 등의 기능을 수행할 수 있음

API Gateway: Zuul을 이용한 아키텍처

  1. 클라이언트(사용자)는 API Gateway(Zuul)로 API 요청을 함
  2. API Gateway는 Discovery Server(Eureka Server)로 백엔드 서비스에 대한 위치에 대한 Query(조회)를 수행하여 값을 받음
  3. 전달받은 위치에 따라서 서버로 요청함
  4. API Gateway에서는 서버에서 응답을 받아옴
  5. 결과값을 Client로 반환해줌

 

5. 로드 밸런싱(Load balancing): Spring Cloud Routing

  • 분산 시스템에서 '서비스를 관리'하기 위한 프레임워크이며 여러 대의 서버가 있는 환경에서 트래픽을 분산시키는 기술을 의미
  • 이를 통해 일부 서버가 과부하가 걸리는 것을 방지하고, 전체 시스템의 안정성과 성능을 향상할 수 있음
  • 서버의 부하를 분산시켜 안정적인 서비스를 제공하기 위한 기술

 

[클라이언트 사이드 로드밸런싱(=내부 로드밸런싱) vs 서버 사이드 로드밸런싱 (= 외부 로드밸런싱)]

 

클라이언트 사이드 로드밸런싱(= 내부 로드밸런싱)

  • 로드 밸런싱을 클라이언트 측에서 수행하는 것을 의미하며 로드밸런서가 여러 대의 서버가 들어오는 요청을 균등하게 분산하여 처리하는 작업을 의미함
  • 서버 측의 부하를 줄일 수 있음

서버 사이드 로드밸런싱 (외부 로드밸런싱)

  • 로드 밸런싱을 서버 측에서 수행하는 것을 의미하며 로드밸런서가 클라이언트의 요청을 균등하게 분산하여 처리하는 작업을 의미
  • 클라이언트 측의 부하를 줄일 수 있음

 

Ribbon 이용하기: Client side LoadBalancer

Spring Cloud Ribbon

  • Netfix에서 개발한 오픈소스 프로젝트로 클라이언트 측 '적재 분산 기술'을 제공하는 라이브러리
  • 주요한 기능으로는 로드밸런싱, 장애 조치, 지연 시간 및 재시도와 같은 기능을 제공함
  • Ribbon은 Eureka와 같은 서비스 디스커버리 클라이언트와 함께 사용할 수 있으며, 클라이언트 측 부하 분산을 수행함. 이는 클라이언트 측 로드밸런싱을 통해 서버의 작업 부하를 분산시키므로 서버 측에 대한 부하 분산을 위해 로드밸런서를 구성하거나 관리할 필요가 없음

Client Side LoadBalancer: Ribbon을 이용한 아키텍처

  1. 서버를 기준으로 Discovery Server로 서비스 간의 호출을 위한 서비스 인스턴스를 요청함: Service Discovery
  2. Discovery Server는 Load Balancer(Ribbon)로 서비스 인스턴스를 요청함 : Request Service Instance
  3. Load Balancer(Ribbon)는 서비스 인스턴스를 확인하여 서비스로 응답해줌: Respons Service Instance
  4. 서비스에서는 응답받은 인스턴스를 통해서 다른 서비스와 서로 호출함: Service-to-Service calls

 

6. 서킷 브레이커(Circuit Breakers): Spring Cloud Circuit Breaker

  • 분산 시스템에서 장애 발생 시 '전체 시스템의 장애를 방지'하기 위해 사용되는 기술을 의미함. 참고로 서킷 브레이커는 일종의 전기 회로의 개념과 비슷
  • 주용한 기능으로는 장애 회복 기능, 서킷 브레이커 패턴 구현, 요청 실패 처리, 장애 상황 모니터링 및 알림 기능 제공

서킷 브레이커의 동작

  • 분산 시스템에서는 다양한 서비스들이 서로 연동되어 동작함. 그렇기에 하나의 서비스의 장애가 다른 서비스까지 전파될 가능성이 있고 모든 서비스가 동작하지 않는다면 전체 시스템이 마비될 수 있는 상황이 될 수 있음
  • 이를 방지하기 위해 장애가 발생한 서비스에 대한 요청을 빠르게 차단하며 이후 복구되기 전까지 다른 서비스에 영향을 주지 않음

서킷 브레이커 패턴

  • 다른 서비스에 대한 호출에 대해 모니터링하며 '요청 실패율'이 일정 임계치를 넘어가면 장애가 발생한 서비스로의 요청을 차단하여 Fail Fas하는 방법을 의미

속성

속성 설명
fail fast - 호출한 서비스가 응답하지 않으면 해당 호출을 빠르게 실패시킴
- 장애 서비스에 대한 요청이 너무 많아져서 전체 시스템이 더 이상 사용 불가능해지는 상황을 방지할 수 있음
fallback - 호출한 서비스가 실패하면 미리 정의된 대체 메서드를 호출함
- 동일하게 장애 서비스에 대한 요청이 너무 많아져서 전체 시스템이 더 이상 사용 불가능해지는 상황을 방지할 수 있음

 

서킷 브레이커의 3가지 상태

분류 Closed Open Half-Open
상태 서킷 브레이커가 동작하지 않는 상태 서킷 브레이커가 동작 중인 상태 서킷 브레이커가 부분적으로 열린 상태
동작 모든 요청이 성공하거나 실패할 때마다 서킷 브레이커는 요청 수를 세고 일정 실패 비율 이상일 때 발동 서킷 브레이커는 일정 시간 동안 요청을 차단하고, 실패한 요청은 즉시 반환. 이후 일정 시간이 지나면 Half-Open 상태로 전환 서킷 브레이커는 일부 요청을 처리하면서 성공한 요청만큼 상태를 복구함. 이후 모든 요청은 Closed 상태로 전환됨
요청 Open 상태가 되고 일정 시간이 지난 상황 외부(Callee)로의 요청을 차단하고 바로 에러를 받음 외부(Callee)로의 요청을 차단하고 바로 에러를 받음
상태 전이 외부로의 요청을 차단하고, 바로 에러를 받음 특정 시간이 지나면 Half Open 상태가 됨 일부 허용된 요청들이 성공한 경우 Closed 상태로, 실패인 경우 Open 상태로 변경

 

서킷 브레이커 패턴의 흐름

  1. 정상적인 상태에서는 외부 서버는 정상 실행 중이고, 서킷이 닫혀있는 상태로 정상적으로 서비스 간의 데이터 전달이 되는 상태: 정상 동작
  2. 외부 서버에서 장애 발생: 장애 발생
  3. 외부 서버의 장애로 요청이 실패하고 서킷 브레이커의 상태가 Open 상태가 되: 상태 Open 전환
  4. 외부 서버의 장애가 정상적으로 복구됨: 정상 복구
  5. Open 상태에서 일정 시간이 지나고 Half Open 상태로 변경이 됨: 상태 Open->Half Open
  6. 일부 요청들이 외부 서버로 전달되고 응답에 성공: 상태 Closed 상태
  7. 모든 요청이 정상적으로 전달됨: 상태 Open 전환

 

서킷 브레이커 흐름

  1. 클라이언트에서 API 요청
  2. 최초 서비스 A에 호출됨
  3. 서비스 A에서는 서비스 B로 요청 : Service-to-Service calls
  4. 서비스 B에서는 정상처리가 완료되어 서비스 A로 응답 값을 반환함
  5. 서비스 B에서는 서비스 C로 요청
  6. 서비스 호출 중 에러 발생
  7. 응답으로 Fallback을 전달
  8. 외부 서버가 정상화되면 정상적인 응답 갑을 반환함

 

주요 라이브러리: Hystrix

  • Netflix에서 개발한 오픈소스 프로젝트로 서킷 브레이커 라이브러리
  • Spring Cloud 에서 서킷 브레이커를 구현하는 데 사용
  • 간단한 설정으로 서킷 브레이커를 구현할 수 있으며, 동작 모니터링 기능도 제공

Resilience4J

  • 자바 기반의 오픈 소스 라이브러리로 분산 시스템에서의 장애에 대응하는 데 도움을 주는 라이브러리
  • Resilience4J는 넷플릭스의 Hystrix와 유사한 성능을 제공하지만, 더 유연하고 가벼움
  • 주요한 Circuit Breaker, Rate Limiter, Retry, Bulkhead, Cache 기능을 제공함
기능 설명
Circuit Breaker 서비스 호출 실패 시 일시적으로 서비스 호출을 차단하는 기능
Rate Limiter 서비스 호출 빈도를 제한하는 기능
Retry 서비스 호출 실패 시 지정된 횟수만큼 재시도하는 기능
Bulkhead 서비스 호출 시 동시에 처리되는 요청의 개수를 제한하는 기능
Cache 서비스 호출 결과를 캐싱해 재사용하는 기능

 

 

 

7. 글로벌 락(Global locks) & 지도자 선출, 클러스터 상태(Leadership election and cluster state): Spring Cloud Cofig

분산 시스템의 일관성, 가용성 및 분할 허용성을 보장하는 데 중요한 기능

 

글로벌 락

  • 분산 시스템에서 여러 서버에서 동시에 접근할 수 있는 데이터에 대한 접근을 제한하기 위한 메커니즘
  • 예를 들면, 동시에 여러 클라이언트가 동일한 데이터를 요청하면, Global Locks는 이를 순차적으로 처리하도록 강제
  • 이를 통해 데이터의 일관성을 유지할 수 있음

 

지도자 선출(Leadership Election)

  • 분산 시스템에서 여러 서버 중에서 하나의 서버가 리더 역할을 맡아 해당 서비스를 제공하도록 하는 기능
  • 이를 통해 분산 시스템에서 데이터 일관성을 유지하고, 서버의 부하를 분산시킬 수 있음

 

클러스터 상태(cluster state)

  • 분산 시스템에서 서버들의 상태와 위치를 파악하고 이를 관리하는 기능
  • 이를 통해 서버의 추가, 삭제, 장애 대응 등을 보다 효과적으로 처리할 수 있음
  • 해당 기능들은 Spring Cloud Config의 'Spring Cloud Consul'을 통해서 기능을 구현할 수 있음

 

Spring Cloud Consul

- Spring Cloud에서 지원하는 서비스 디스커버리와 구성 관리 기능 및 기타 기능을 제공하는 서비스
- Consul을 통해서 분산 시스템에서 서비스 검색, 설정 및 분배, Health Check 및 글로벌 Lock, 강력한 쿼리 기능과 키/값 저장소 등을 제공해 분산 시스템에서 발생하는 여러 문제를 해결할 수 있음
- Spring Cloud Consul 라이브러리를 사용해 Spring 애플리케이션에서 Consul에 등록된 서비스를 가져와서 사용하고 Consul의 다양한 기능을 활용해 분산 시스템 기능을 구현
관계 설명
서비스 디스커버리 서비스 인스턴스의 등록, 발견 및 감시를 수행. Consul 서버와 통신해 서비스 디스커버리를 구현
구성 관리 Key/Value 저장소에 저장됨. Consul 서버와 통신하여 구성 데이터를 가져오고 업데이트함
기타 기능 Consul 클러스터와의 상호작용을 위한 API를 제공하며, Consul의 이벤트 시스템을 사용해 이벤트를 수신하고 처리할 수 있음

 

 

8. 분산 메시징(Distributed messaging): Spring Cloud Messaging

  • 여러 서비스 간의 통신을 위해 사용되는 시스템
  • 여러 서버에 걸쳐 있는 애플리케이션들이 서로 데이터나 메시지를 주고받을 수 있게 함
  • 주요한 기능으로는 메시지 브로커와의 통합, 메시지 라우팅, 메시지 필터링, 메시지 변환 등의 기능이 있고, 이를 처리하기 위해 Spring Cloud에서는 메시징 솔루션으로 Apache Kafka, RabbitMQ, Amazon Kinesis 등이 있음

 

RabbitMQ를 통한 분산 메시징 과정

1. 생산자가 메시지 발행

2. 생상자는 생성한 메시지를 브로커의 Exchange로 메시지 전달

  • Exchange는 메시지를 받아 라우팅을 수행
  • 라우팅 키를 이용해 메시지를 어떤 큐로 전달할지 결정
  • 라우팅을 위해 Exchange Type을 제공함
  • Exchange Type을 이용해 메시지를 적절한 큐에 전달

3. Exchanges는 바인딩을 통해서 큐로 전달함

4. 소비자는 자신이 바라보고 있는 큐를 구독하다가 큐가 삽입되었을 때 메시지를 수신해 처리

 

용어 분류
메시지 송신자와 수신자 간에 전송이 되는 데이터 덩어리
메시지 브로커 메시지를 생성하고 소비하는 클라이언트 간에 메시지를 전달하는 미들웨어
Exchange 메시지를 수신하고 처리할 대상으로 결정하는 구성요소
주로 메시지를 수신하고 특정 큐로 보내는 역할을 수행
생산자 메시지를 생성하고 메시지 브로커에 전송하는 구성요소
소비자 메시지 브로커에서 메시지를 가져와서 수신하고 처리하는 주체
바인딩 클라이언트 애플리케이션과 메시징 시스템 간의 연결을 하는 과정
메시지 큐 메시지 시스템에 저장된 메시지를 의미하며 송신자가 메시지를 전송하면 이를 수신자가 처리할 때까지 대기

 

 

주요 기능

기능 설명
메시지 브로커와의 통합 메시지 브로커와의 연결 설정 및 통신 기능을 제공
메시지 라우팅 메시지의 수신 및 전달 경로 설정 기능을 제공
메시지 필터링 특정 메시지를 수신하거나 무시하는 필터링 기능을 제공
메시지 변환 메시지의 형식 변환 기능을 제공

 

 

분산 메시징 지원하는 라이브러리 및 프레임워크

라이브러리/프레임워크 설명
Spring Cloud Stream 메시지를 생성하고 전송하고 수신하는데 사용할 수 있는 프레임워크
Spring Cloud Bus 분산 시스템에서 구성 요소들 간의 메시지 전송을 지원하는 라이브러리
Spring Cloud Stream Binder - Spring Cloud Stream에서 다양한 메시징 미들웨어를 연결하는 데 사용할 수 있는 라이브러리
- Kafka를 사용하는 경우 Spring Cloud Stream Kafka Binder를 사용해 애플리케이션과 Kafka를 연결할 수 있음

'SpringBoot' 카테고리의 다른 글

[SpringBoot] Spring Cloud OpenFeign  (0) 2026.01.20