🔹 기존 문제
Spring Cloud Config에서 설정 파일(yml)이 변경될 때마다 마이크로서비스를 재기동해야 적용되는 문제가 발생한다.
이러한 비효율적인 과정을 줄이기 위해 다음과 같은 방법을 사용할 수 있다.
Spring Actuator
Spring Boot의 Actuator를 사용하여 마이크로서비스를 재시작하지 않고 설정을 동적으로 갱신하는 방법이다.
1️⃣ Actuator 및 Bootstrap 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
Spring Cloud 최신 버전에서는 bootstrap.yml이 자동 로드되지 않기 때문에 직접 추가해야 한다.
2️⃣ Actuator 엔드포인트 접근 허용 (Security 설정)
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorizeRequest ->
authorizeRequest.requestMatchers("/actuator/**").permitAll()
.anyRequest().authenticated()
);
return http.build();
}
/actuator/** 엔드포인트를 모두 허용하여 API 호출 가능하도록 설정한다.
3️⃣ bootstrap.yml 추가 (Spring Cloud Config 설정)
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce # 가져올 yml 이름
💡bootstrap.yml을 사용하는 이유: application.yml보다 먼저 로드되어 외부 Config 정보를 우선 적용하기 위함
4️⃣ Actuator 설정 (application.yml)
management:
endpoints:
web:
exposure:
include: refresh, health, beans, httptrace # 사용할 Actuator 엔드포인트
- /actuator/refresh를 활성화하여 설정 변경 사항을 적용할 수 있도록 설정한다.
- httptrace 엔드포인트를 사용할 경우, 추가 설정 필요 (Spring Boot 3 기준)
@Bean
public HttpExchangeRepository httpExchangeRepository() {
return new InMemoryHttpExchangeRepository();
}
5️⃣ 외부 yml 변경 사항 적용 (Actuator Refresh 호출)
✅ Spring Cloud Config에서 관리하는 yml 변경 시, 변경 사항 반영 방법
- yml 변경 후 Git에 반영
- Spring Cloud Config는 기본적으로 Git에서 설정 파일을 관리함
- 따라서, 변경 사항을 Git에 commit & push 해야 함
- (Local 파일 모드 사용 시에는 commit 필요 없음)
- 마이크로서비스에서 /actuator/refresh 호출
curl -X POST http://localhost:8080/actuator/refresh
변경된 key 값이 리턴됨
[
"token.secret",
"config.client.version",
"token.expiration_time"
]
6️⃣ API Gateway를 통한 Actuator Refresh 자동화
API Gateway에서 모든 마이크로서비스의 /actuator/refresh를 호출하여 설정을 일괄 반영할 수 있음.
✅ API Gateway에서 Actuator 라우팅 설정 후, 각 마이크로서비스의 설정 갱신
http://127.0.0.1:8000/user-service/actuator/refresh
http://127.0.0.1:8000/order-service/actuator/refresh
하지만, 모든 마이크로서비스에 대해 각각 /actuator/refresh를 호출해야 하는 번거로움이 발생한다.
⚠️ Actuator Refresh의 한계
- 모든 마이크로서비스에서 개별적으로 호출해야 함
→ 서비스 개수가 많아지면 유지보수 비용 증가 - Config 변경 시 자동 반영이 아님
→ /actuator/refresh API를 수동으로 호출해야 적용됨
📌 이 문제를 해결하기 위한 방법
- Spring Cloud Bus (RabbitMQ, Kafka 활용)
- Config 변경 자동 알림 기능
다음 글에서는 Spring Cloud Bus를 사용하는 방법에 대해서 알아보겠다.
'백엔드 Backend > 서버 Server' 카테고리의 다른 글
Spring Cloud Config - 정보 암호화 (0) | 2025.01.15 |
---|---|
Spring Cloud Bus (0) | 2025.01.15 |
Spring Cloud Config - 분산 시스템 설정 관리 (1) | 2025.01.14 |
Eureka + Spring Cloud Gateway 구현하기 (0) | 2025.01.07 |
API 게이트웨이 서비스 - (2) Spring Cloud Gateway (0) | 2025.01.06 |