백엔드 Backend/서버 Server

Spring Cloud Config 자동으로 반영하기 (feat. Acturator)

달래dallae 2025. 1. 14. 15:28

🔹 기존 문제

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 변경 시, 변경 사항 반영 방법

  1. yml 변경 후 Git에 반영
    • Spring Cloud Config는 기본적으로 Git에서 설정 파일을 관리함
    • 따라서, 변경 사항을 Git에 commit & push 해야 함
    • (Local 파일 모드 사용 시에는 commit 필요 없음)
  2. 마이크로서비스에서 /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의 한계

  1. 모든 마이크로서비스에서 개별적으로 호출해야 함
    → 서비스 개수가 많아지면 유지보수 비용 증가
  2. Config 변경 시 자동 반영이 아님
    → /actuator/refresh API를 수동으로 호출해야 적용됨

📌 이 문제를 해결하기 위한 방법

  • Spring Cloud Bus (RabbitMQ, Kafka 활용)
  • Config 변경 자동 알림 기능

 

다음 글에서는 Spring Cloud Bus를 사용하는 방법에 대해서 알아보겠다.