본문으로 건너뛰기

1. Spring Cloud Bus 개요

  • Spring Cloud Bus는 분산 시스템의 노드들을 경량 메시지 브로커로 연결하여 구성 정보 변경이나 시스템 관리 명령을 효과적으로 전파할 수 있게 해주는 도구입니다.
  • 확장된 Spring Boot 애플리케이션의 분산 액추에이터 역할을 하며, 애플리케이션 간의 통신 채널로도 활용할 수 있습니다.
정보

Spring Cloud Bus는 AMQP 브로커나 Kafka를 전송 계층으로 사용할 수 있으며, 각각에 대한 스타터 의존성을 제공합니다.

2. 시작하기

2.1 의존성 설정

  • Spring Cloud Bus는 클래스패스에서 자신을 감지하면 자동으로 설정됩니다.
  • 다음 의존성 중 하나를 추가하여 시작할 수 있습니다:
    • AMQP (RabbitMQ) 사용 시: spring-cloud-starter-bus-amqp
    • Kafka 사용 시: spring-cloud-starter-bus-kafka

2.2 메시지 브로커 설정

  • 로컬 환경에서는 기본 설정으로 동작하지만, 원격 환경에서는 브로커 접속 정보를 설정해야 합니다.

RabbitMQ 설정 예시

spring:
rabbitmq:
host: mybroker.com
port: 5672
username: user
password: secret

3. Bus 엔드포인트 활용

  • Spring Cloud Bus는 세 가지 주요 엔드포인트를 제공합니다

3.1 /actuator/busrefresh

  • RefreshScope 캐시를 초기화하고 @ConfigurationProperties를 다시 바인딩합니다.
정보

@RefreshScope는 Spring Cloud에서 제공하는 특별한 scope입니다. 이 애노테이션이 붙은 빈은 런타임에 재생성이 가능합니다. 따라서 /actuator/refresh 엔드포인트가 호출되면 해당 빈이 새로운 설정값으로 다시 만들어집니다

# 엔드포인트 활성화
management.endpoints.web.exposure.include=busrefresh

3.2 /actuator/busenv

  • 여러 인스턴스의 환경 변수를 지정된 값으로 변경합니다.
# 엔드포인트 활성화
management.endpoints.web.exposure.include=busenv

사용 예시

{
"name": "key1",
"value": "value1"
}
  • /actuator/busenv로 POST 요청을 보내면 모든 인스턴스의 key1 환경 변수가 value1로 변경됩니다.

3.3 /actuator/busshutdown

  • 애플리케이션을 정상적으로 종료합니다.
# 엔드포인트 활성화
management.endpoints.web.exposure.include=busshutdown

4. 인스턴스 주소 지정

4.1 서비스 ID 구성

  • 각 인스턴스는 고유한 서비스 ID를 가지며, spring.cloud.bus.id로 설정할 수 있습니다. 기본값은 다음 형식을 따릅니다:
app:index:id
  • app: vcap.application.name 또는 spring.application.name
  • index: 인스턴스 구분을 위한 인덱스
  • id: 인스턴스 고유 식별자
경고

서비스 ID는 반드시 고유해야 합니다. 동일한 ID를 가진 여러 인스턴스가 있으면 이벤트가 처리되지 않을 수 있습니다.

5. 이벤트 추적

  • 이벤트 추적을 활성화하려면 다음 설정을 추가합니다:
spring.cloud.bus.trace.enabled=true

추적 데이터 예시

{
"timestamp": "2015-11-26T10:24:44.411+0000",
"info": {
"signal": "spring.cloud.bus.ack",
"type": "RefreshRemoteApplicationEvent",
"id": "c4d374b7-58ea-4928-a312-31984def293b",
"origin": "stores:8081",
"destination": "*:**"
}
}

6. 커스텀 이벤트 구현

6.1 이벤트 클래스 작성

public class MyEvent extends RemoteApplicationEvent {
// 이벤트 구현
}

6.2 이벤트 스캔 설정

@Configuration
@RemoteApplicationEventScan(basePackageClasses = BusConfiguration.class)
public class BusConfiguration {
// 설정 구현
}

커스텀 이벤트를 사용할 때는 생산자와 소비자 모두 클래스 정의에 접근할 수 있어야 합니다.

7. 주요 설정 속성

속성기본값설명
spring.cloud.bus.enabledtrueBus 활성화 여부
spring.cloud.bus.destination-메시지 목적지 이름
spring.cloud.bus.trace.enabledfalse이벤트 추적 활성화 여부
spring.cloud.bus.ack.enabledtrue응답 메시지 활성화 여부

8. 마치며

  • Spring Cloud Bus는 마이크로서비스 아키텍처에서 구성 정보를 효과적으로 동기화할 수 있는 강력한 도구입니다.
  • 메시지 브로커를 통한 이벤트 기반 통신으로 시스템의 일관성을 유지하면서도 유연한 확장이 가능합니다.
실무 적용 팁
  • 개발 환경에서는 RabbitMQ를, 프로덕션 환경에서는 Kafka를 사용하는 것이 일반적입니다.
  • 민감한 설정 정보는 암호화하여 전송하는 것을 권장합니다.
  • 이벤트 추적은 디버깅 시에만 활성화하여 성능 영향을 최소화합니다.