지난 시간에는 Config 서버 생성 및 설정을 진행하였습니다.
하지만 실행 중인 MSA(Microservices Architecture) 애플리케이션들이 Config 서버와 연결되어 있는 상황에서, Git에 저장된 user-service-local.yml 파일의 내용이 변경되었다고 가정해봅시다.
이 경우 Config Server는 즉시 변경된 내용을 반영할 수 있습니다.
그러나 실행 중인 애플리케이션들은 이러한 변경 사항을 자동으로 반영하지 않기 때문에,
새로운 설정이 애플리케이션에 어떻게 적용될지를 고민해야 합니다.
이를 해결할 수 있는 방법으로는 다음과 같은 방안들이 있습니다
Spring Cloud Config Server를 사용하는 경우, @RefreshScope
어노테이션을 통해 특정 Bean이나 설정을 동적으로 업데이트할 수 있습니다.
동작 방식:
1. Config Server에서 설정 파일을 변경합니다.
2. 실행 중인 MSA에 HTTP POST
요청을 보내 /actuator/refresh
엔드포인트를 호출합니다.
3. 해당 MSA는 변경된 설정을 다시 로드하고 이를 반영합니다.
장점:
단점:
Spring Cloud Bus는 메시지 브로커(RabbitMQ, Kafka 등)를 통해 설정 변경 사항을 자동으로 전파합니다.
동작 방식:
1. Config Server에서 설정 파일을 변경합니다.
2. Config Server가 메시지 브로커에 변경 이벤트를 전파합니다.
3. 메시지를 수신한 각 마이크로서비스는 /actuator/refresh
를 자동으로 호출하여 변경 사항을 반영합니다.
장점:
단점:
가장 간단한 방법으로, 마이크로서비스를 재시작하여 변경된 설정을 로드합니다.
장점:
단점:
위 방법들 중에서 Spring Cloud Bus를 활용하여 변경 사항을 자동으로 반영하도록 설정하려 합니다.
Spring Cloud Bus는 메시지 브로커를 통해 변경 사항을 효율적으로 전달하며, 대규모 환경에서도 관리가 용이합니다.
RabbitMQ를 실행하려면 Docker를 사용할 수 있습니다.
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
RabbitMQ 관리 UI는 http://localhost:15672
에서 접근 가능하며, 기본 사용자/비밀번호는 아래와 같습니다:
guest
guest
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: refresh, health, beans, busrefresh
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: refresh, health, beans, busrefresh
Webhook에 ngrok URL을 등록합니다:
@GetMapping("/health_check")
public String status(Authentication authentication) {
log.info("email : {}", authentication.getName());
return String.format("It's Working in User Service"
+ ", port(local.server.port) = " + env.getProperty("local.server.port")
+ ", token refresh time = " + env.getProperty("jwt.refresh.expiration"));
}
token refresh 값을 0으로 변경 후 Git에 푸쉬.
Webhook을 통해 POST /monitor 요청이 온것을 확인:
Postman으로 테스트하여 변경된 값이 반영된 것을 확인:
이제 Git Repository에서 설정을 변경하면 서버 재시작, 수동 API 요청 없이 변경 사항을 자동으로 반영할 수 있습니다.
다만, Git Repository에 민감한 정보(jwt.token, db 정보 등)가 노출되는 문제가 있습니다.
다음 시간에는 비대칭 키를 활용한 암호화와 복호화 설정에 대해 다루겠습니다.
Reference
- https://medium.com/eum-tech-lab/github-webhooks%EC%97%90%EC%84%9C-localhost%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%97%86%EB%8A%94-%EC%9D%B4%EC%9C%A0-9c0d2aecf118
- https://memodayoungee.tistory.com/157
- https://ksh-coding.tistory.com/141#2.%20Spring%20Cloud%20Config%EB%9E%80%3F-1
- https://velog.io/@captain-yun/Spring-Cloud-Bus-Spring-Cloud-Config-monitor-%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C%EB%9F%B0%ED%83%80%EC%9E%85-Refresh-configurations
- https://sjh9708.tistory.com/124