🔹 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의 동작 방식
- 각 마이크로서비스는 Spring Cloud Config Server와 연결되어 있다.
- Spring Cloud Config Server는 Spring Cloud Bus를 통해 메시지 브로커(RabbitMQ, Kafka)와 연결된다.
- 어떤 마이크로서비스에서 설정 변경을 알리면,
- 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 의존성을 추가하면 된다.
'백엔드 Backend > 서버 Server' 카테고리의 다른 글
Spring Cloud Config - 정보 암호화 (0) | 2025.01.15 |
---|---|
Spring Cloud Config 자동으로 반영하기 (feat. Acturator) (0) | 2025.01.14 |
Spring Cloud Config - 분산 시스템 설정 관리 (1) | 2025.01.14 |
Eureka + Spring Cloud Gateway 구현하기 (0) | 2025.01.07 |
API 게이트웨이 서비스 - (2) Spring Cloud Gateway (0) | 2025.01.06 |