WEB/Spring

Spring Cloud Config Server 설정하기2(Spring Cloud Bus)

대전집주인 2024. 9. 23. 14:07
728x90
SMALL

Spring Cloud Bus는 분산 시스템에서 여러 애플리케이션 간에 메시지를 통해 이벤트를 전달하고, 설정 변경 등의 작업을 일괄적으로 처리할 수 있도록 돕는 모듈입니다. 주로 Spring Cloud Config와 함께 사용되며, 여러 마이크로서비스에 대한 설정 변경이나 이벤트 전파를 쉽게 관리하는 데 유용합니다.

 

 

주요 기능과 역할

  1. 분산된 애플리케이션 간 이벤트 브로드캐스팅:
    • Spring Cloud Bus는 메시지 브로커(예: RabbitMQ 또는 Kafka)를 사용하여 애플리케이션 간에 이벤트를 브로드캐스트합니다. 이를 통해 모든 마이크로서비스에 한 번의 명령으로 설정 변경, 캐시 초기화, 상태 업데이트 등을 적용할 수 있습니다.
  2. 설정 변경 반영:
    • Spring Cloud Config와 함께 사용하면, Config Server에서 설정이 변경되었을 때 이를 모든 마이크로서비스에 자동으로 전파할 수 있습니다. 즉, 설정 파일을 수정하고 버스 리프레시 명령을 보내면, 각 서비스가 최신 설정으로 다시 로드됩니다.
  3. 메시지 기반 통신:
    • Spring Cloud Bus는 메시지 브로커를 통해 통신하기 때문에, 비동기적으로 메시지를 보내고 받으며, 마이크로서비스 간에 느슨한 결합을 유지할 수 있습니다.
  4. 서비스 간 동기화 및 상태 전파:
    • 여러 서비스 간의 상태를 실시간으로 동기화하고, 특정 서비스에서 발생한 이벤트를 다른 서비스에 즉시 전파할 수 있습니다. 이를 통해 서비스 간 통신을 단순화하고, 이벤트 중심 아키텍처를 쉽게 구현할 수 있습니다.

 

Spring Cloud Bus와 Spring Cloud Config의 관계

  • Spring Cloud Config는 여러 마이크로서비스의 구성 정보를 중앙에서 관리하는 역할을 합니다. Spring Cloud Bus는 이 설정 변경 사항을 자동으로 모든 서비스에 전파하는 역할을 합니다.
  • actuator/bus-refresh 엔드포인트를 호출하여 전체 마이크로서비스에 설정 변경을 적용할 수 있습니다.

 

Spring Cloud Bus의 작동 방식

  1. 메시지 브로커 설정:
    • Spring Cloud Bus는 메시지 브로커를 통해 이벤트를 전파합니다. RabbitMQ 또는 Kafka와 같은 브로커를 설정하고, 이를 통해 애플리케이션 간에 메시지를 주고받습니다.
  2. 버스 리프레시:
    • curl -X POST http://<service-url>/actuator/bus-refresh 명령어로 설정을 리프레시할 수 있습니다. 이 명령어를 통해 이벤트가 브로커에 전파되고, 이를 수신한 서비스들은 즉시 설정을 업데이트합니다.

 

장점

  1. 분산 시스템에서 일괄 처리: 모든 애플리케이션에서 수동으로 설정을 변경할 필요 없이 한 번의 명령으로 모든 서비스에 적용 가능합니다.
  2. 비동기 이벤트 처리: 메시지 브로커를 사용해 비동기 방식으로 이벤트를 전달하므로, 서비스 간의 결합도를 낮춥니다.
  3. 확장성: 마이크로서비스 아키텍처에서 서비스의 수가 증가하더라도 중앙에서 변경 사항을 일괄 적용할 수 있어 확장성이 뛰어납니다.

단점

  1. 메시지 브로커 의존: Spring Cloud Bus는 메시지 브로커(RabbitMQ, Kafka 등)에 의존하기 때문에, 브로커의 설정 및 운영 복잡성이 추가됩니다.
  2. 보안 문제: 메시지가 여러 애플리케이션에 브로드캐스트되므로 보안적인 측면에서 적절한 인증 및 권한 관리를 해야 합니다.

 

Spring Cloud Bus 설정하기

저의 경우 메시지 브로커로 RabbitMQ 를 선택하였습니다. Config Server 와 두개의 서비스를 생성하여 Config Server 에busrefresh 함으로서 메시지 브로커로 두 서비스에 config 값이 refresh 되도록 하였습니다.

 

1. RabbitMQ 설치

RabbitMQ를설치하고 서버를 가동하면 http://localhost:15672/ 해당 url로 접근하면 로컬에 아래와 같은 페이지가 열립니다.

 

2. gradle 추가

implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

 

3. application.yml 설정

저의 경우 Config Server를 통해 나머지 서비스에 refresh를 하기 위해 세개의 프로젝트 yml 파일에 RabbitMQ 를 연결해주었습니다.

 

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

 

RabbitMQ의 기본 포트 5672와 기본 계정인 guest 를 설정해 줍니다.

 

위와 같이 Spring Cloud bus의 RabbitMQ를 설정해주면 아래와 같이 3개의 프로젝트와 연결이 되었고 Exchanges  springCloudBus 에 세개의 프로젝트가 연결되어 있다는걸 알 수 있습니다.

 

4. 테스트

 

깃허브 config의 test 값은 test1로 되어있습니다.

 

 

test의 값을 test2로 변경합니다.

 

test2로 값을 변경하였만 실제 서버에서 test를 log로 찍어보면 test1로 log가 발생합니다.

 

Spring Cloud Config Server 설정하기1(Spring Cloud Config)

 

이전과 다르게 RabbitMQ를 통해 Config Server와 연결된 모든 서비스에 refresh를 줄 수 있습니다.

 

cmd 창에서 config server 포트인 8888 에 actuator 명령어인 busrefresh 를 호출합니다.

curl -X POST http://localhost:8888/actuator/busrefresh

 

위와 같이 호출시 RabbitMQ 를 확인해보면 springCloudBus 큐로 값이 들어왔다는걸 확인 할 수 있습니다.

 

 

Spring Cloud Bus를 통해 두개의 서비스에 springCloudBus 작동하여 config 값을 다시 가져옵니다.

 

test1 이 아닌 변경된 test2로 값이 찍히는걸 볼 수 있습니다.

 

Spring Cloud Config Server 설정하기1(Spring Cloud Config)
Spring Cloud Config Server 설정하기2(Spring Cloud Bus)

728x90
LIST