Spring Cloud Bus

2025. 1. 15. 15:28· 백엔드 Backend/서버 Server
목차
  1. 🔹 Acturator 문제점
  2. 1️⃣ Spring Cloud Config + Spring Cloud Bus 사용
  3. 2️⃣ Spring Cloud Bus 기본 개념
  4. 3️⃣ Spring Cloud Bus 설정
  5. 4️⃣ RabbitMQ 설치 방법
  6. 5️⃣ Spring Cloud Bus 적용 및 테스트
  7. ⚠️ 주의할 점
  8. 🚀 결론

🔹 Acturator 문제점

이전 글에서는 Acturator를 사용하여 config 파일들을 수정하였다.

하지만 이 방법은 Spring Cloud Config에서 설정 파일(yml)이 변경되면, 각각의 마이크로서비스에서 직접 /actuator/refresh를 호출해야 변경된 데이터를 가져올 수 있다.

따라서, 모든 마이크로서비스에서 개별적으로 refresh를 호출해야 하는 불편함이 있을 수 있다.
이를 해결하기 위해 Spring Cloud Config + Spring Cloud Bus를 활용할 수 있다.

 

 

1️⃣ Spring Cloud Config + Spring Cloud Bus 사용

Spring Cloud Bus는 경량 메시지 브로커(RabbitMQ, Kafka)를 통해 변경 사항을 모든 마이크로서비스에 자동 전파할 수 있도록 도와준다.

 

📌 Spring Cloud Bus의 동작 방식

  1. 각 마이크로서비스는 Spring Cloud Config Server와 연결되어 있다.
  2. Spring Cloud Config Server는 Spring Cloud Bus를 통해 메시지 브로커(RabbitMQ, Kafka)와 연결된다.
  3. 어떤 마이크로서비스에서 설정 변경을 알리면,
    • Spring Cloud Bus가 모든 마이크로서비스에 변경 사항을 전파 (Broadcast)
    • 즉, /actuator/refresh를 개별 호출할 필요 없이 자동 반영

 

 

2️⃣ Spring Cloud Bus 기본 개념

📌 AMQP (Advanced Message Queuing Protocol)

  • 메시지 지향 미들웨어를 위한 표준 프로토콜
  • 메시지 큐잉, 라우팅, 신뢰성, 보안 지원
  • Erlang, RabbitMQ에서 사용됨

 

📌 RabbitMQ vs Kafka

  RabbitMQ Kafka
방식 메시지 브로커 방식 분산 스트리밍 방식
메시지 전달 직접 소비자에게 전달 토픽에 메시지를 전달 (Pub/Sub)
처리 속도 초당 20k+ 메시지 초당 100k+ 이벤트
적용 예시 마이크로서비스 간 메시지 교환 대규모 데이터 스트리밍

 

 

3️⃣ Spring Cloud Bus 설정

Spring Cloud Bus & Actuator 의존성 추가

📌 모든 마이크로서비스, API Gateway, Spring Cloud Config Server에 추가해야 함

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

이제 어디에서나 /actuator/busrefresh를 호출하면, 변경 사항이 전체 마이크로서비스에 반영됨

 

 

4️⃣ RabbitMQ 설치 방법

1) Erlang 설치

RabbitMQ는 Erlang 기반으로 동작하므로, Erlang을 먼저 설치해야 함.
🔗 Erlang 공식 사이트에서 다운로드 후 설치

 

2) RabbitMQ 설치

🔗 RabbitMQ 공식 사이트에서 다운로드 후 설치

 

3) RabbitMQ Management Plugin 활성화

$ rabbitmq-plugins enable rabbitmq_management

이후, http://localhost:15672 에 접속하여 관리 페이지 확인

 

 

5️⃣ Spring Cloud Bus 적용 및 테스트

1) 마이크로서비스가 RabbitMQ에 정상적으로 등록되었는지 확인

📌 설정 파일이 변경될 경우, 로그를 통해 확인 가능

2025-01-15T15:08:49.379+09:00  INFO 24164 --- [user-service] [o-auto-1-exec-9] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1736921329379, current=UP, previous=DOWN]

 

2) /actuator/busrefresh 호출하여 변경 사항 반영

curl -X POST http://127.0.0.1:8000/user-service/actuator/busrefresh

변경 사항 반영 로그 확인 ✅ 

2025-01-15T15:08:49.381+09:00  INFO 24164 --- [user-service] [o-auto-1-exec-9] o.s.cloud.bus.event.RefreshListener      : Keys refreshed [token.secret]
2025-01-15T15:08:49.399+09:00  INFO 24164 --- [user-service] [foReplicator-%d] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_USER-SERVICE/user-service:98786c663a793767ecbf0bbb725bf547 - registration status: 204

📌 이제 다른 마이크로서비스에서도 동일한 변경 사항이 반영되었다.

2025-01-15T15:08:49.388+09:00  INFO 23820 --- [apigateway-service] [F-oJyVA2XULMQ-1] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1736921329388, current=UP, previous=DOWN]
2025-01-15T15:08:49.407+09:00  INFO 23820 --- [apigateway-service] [foReplicator-%d] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_APIGATEWAY-SERVICE/host.docker.internal:apigateway-service:8000 - registration status: 204
2025-01-15T15:08:49.407+09:00  INFO 23820 --- [apigateway-service] [F-oJyVA2XULMQ-1] o.s.cloud.bus.event.RefreshListener      : Keys refreshed [token.secret]

 


 

 

⚠️ 주의할 점

1️⃣ @Value로 직접 Bean 등록된 값은 변경되지 않음

@Value("${token.secret}") private String secretKey;

이런 방식으로 Bean을 등록하여 Spring이 관리하게 되면 설정이 변경되더라도 반영되지 않음


✅ 해결 방법 → Environment를 활용하여 값을 가져와야 함.

@Autowired
private Environment env;

public String getSecretKey() {
    return env.getProperty("token.secret");
}

 

 

2️⃣ Spring Cloud Config 서버와 마이크로서비스가 모두 RabbitMQ에 정상적으로 연결되어 있어야 함

RabbitMQ 관리 페이지 (http://localhost:15672)에서 정상적으로 연결되었는지 확인할 것!

 


 

🚀 결론

✅ Spring Cloud Bus를 활용하면, 어느 마이크로서비스에서든 /actuator/busrefresh 한 번만 호출하면 변경 사항이 전체 반영된다.

✅ RabbitMQ 또는 Kafka를 활용하여 메시지를 브로드캐스트함으로써, 모든 마이크로서비스가 설정을 자동으로 갱신된다.

📌 더 이상 /actuator/refresh를 모든 서비스에서 수동 호출할 필요 없음!
📌 Config 변경 사항을 한 번의 API 호출로 전체 서비스에 반영 가능!

💡 RabbitMQ 대신 Kafka를 사용하고 싶다면, spring-cloud-starter-bus-kafka 의존성을 추가하면 된다.

 

참고 https://www.inflearn.com/community/questions/677114/busrefresh%EB%A1%9C-gateway-ip-%EB%B3%80%EA%B2%BD-%EC%8B%9C-user-service-%EB%82%B4-websecurity-%EC%84%A4%EC%A0%95-%EC%9E%90%EB%8F%99-%EB%B0%98%EC%98%81-%EC%97%AC%EB%B6%80?focusComment=220658&srsltid=AfmBOorWYtjZ0xfoVjxNqwN3EJR1h23wbHNLrs4wWMO-ejhCbJx4fxDy

'백엔드 Backend > 서버 Server' 카테고리의 다른 글

Spring Cloud Config - 정보 암호화  (0) 2025.01.15
Spring Cloud Config 자동으로 반영하기 (feat. Acturator)  (0) 2025.01.14
Spring Cloud Config - 분산 시스템 설정 관리  (3) 2025.01.14
Eureka + Spring Cloud Gateway 구현하기  (0) 2025.01.07
API 게이트웨이 서비스 - (2) Spring Cloud Gateway  (0) 2025.01.06
  1. 🔹 Acturator 문제점
  2. 1️⃣ Spring Cloud Config + Spring Cloud Bus 사용
  3. 2️⃣ Spring Cloud Bus 기본 개념
  4. 3️⃣ Spring Cloud Bus 설정
  5. 4️⃣ RabbitMQ 설치 방법
  6. 5️⃣ Spring Cloud Bus 적용 및 테스트
  7. ⚠️ 주의할 점
  8. 🚀 결론
'백엔드 Backend/서버 Server' 카테고리의 다른 글
  • Spring Cloud Config - 정보 암호화
  • Spring Cloud Config 자동으로 반영하기 (feat. Acturator)
  • Spring Cloud Config - 분산 시스템 설정 관리
  • Eureka + Spring Cloud Gateway 구현하기
달래dallae
달래dallae
백엔드를 열심히 갈고 닦아서 광내봅시다 ~_~
달래dallae
머루랑달래랑
달래dallae
전체
오늘
어제
  • 분류 전체보기 (54)
    • 프로젝트 Project (14)
    • 백엔드 Backend (27)
      • 기본 개념 (13)
      • 서버 Server (9)
      • 스프링 Spring (1)
      • JPA (3)
    • 데이터베이스 Database (6)
      • MySQL (1)
      • Oracle (5)
    • 언어 Language (0)
      • 자바 Java (0)
      • 파이썬 Python (0)
    • 알고리즘 Algorithm (1)

블로그 메뉴

  • 홈
  • 글쓰기
hELLO · Designed By 정상우.v4.2.2
달래dallae
Spring Cloud Bus
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.