개요
Spring Cloud Config 서버를 이용하여 설정 정보가 변경되었을 때 서버를 다시 시작하지 않고 반영하는 방법을 정리해보겠습니다.
저는 예시로 Spring Boot로 Product 서버를 만들었고 Github를 외부 저장소로 했습니다.
구현
의존성 추가
// actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
Actuator는 Spring Boot 애플리케이션의 운영 중인 상태 및 성능 지표를 모니터링하고 관리하는 기능을 제공하는 라이브러리 입니다. Actuator는 내부 정보를 엔드포인트를 통해 접근할 수 있게 합니다. (예시, API 통신)
Spring Boot Actuator 사이트에 들어가면 다양한 엔드포인트를 소개한 글을 볼 수 있습니다.
yml 파일 등록
management:
endpoints:
web:
exposure:
include: refresh, health, beans
include를 통해 사용하고자 하는 엔드포인트들을 등록할 수 있습니다.
저는 refresh, health, beans를 등록했습니다.
Actuator 실행
Spring Boot를 실행한 후 API를 보내 Actuator의 엔드포인트를 실행할 수 있습니다.
health
해당 어플리케이션의 기동 상태를 확인합니다.
beans
현재 서버에 등록된 bean 들의 정보를 확인할 수 있습니다.
refresh
설정 정보를 업데이트 합니다.
저는 refresh를 엔드포인트를 이용해 변경된 설정 정보를 Spring Boot의 재시작 없이 반영해보겠습니다.
변경된 설정 정보 반영
현재 Product 서버는 product-dev.yml을 설정 파일을 사용하고 있습니다. 여기서 status를 변경하고 반영해 보겠습니다.
Product-dev.yml 파일(변경 전)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dotd?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
username: root
password: 비밀번호
jpa:
hibernate:
ddl-auto: create
cache:
type: redis
redis:
host: localhost
port: 6379
password: 비밀번호
status: "dev"
health-check
이전글에서 만든 health-check 메소드를 통해 현재 어떤 설정 정보를 가지고 있는지 확인합니다.
health-check 메소드
// yml 파일 확인
@GetMapping("health_check")
public ResponseEntity<?> status() {
StringBuilder sb = new StringBuilder();
sb.append("Product Server 설정 정보 : \n")
.append("env 상태 : ").append(env.getProperty("status")).append("\n")
.append("기본값 : ").append(env.getProperty("commonValue")).append("\n");
return ResponseEntity.ok(sb.toString());
}
PostMan을 통해 health-check 메소도를 요청했습니다.
env 상태가 dev인 것을 알 수 있습니다.
이제 status를 dev-change로 바꿔보겠습니다.
product-dev.yml (변경 후)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dotd?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
username: root
password: 비밀번호
jpa:
hibernate:
ddl-auto: create
cache:
type: redis
redis:
host: localhost
port: 6379
password: 비밀번호
status: "dev-change"
Refresh 엔드포인트 사용
refresh를 API를 날려 해당 변경 사항을 적용합니다. 저는 PostMan을 사용했습니다.
변경 확인
env 상태가 변경한대로 dev-change로 바뀐 것을 확인할 수 있습니다.
마무리
이번에는 Actuator를 이용하여 설정 파일이 변경되어도 재시작 없이 변경 정보를 반영해보았습니다.
하지만 이 방법은 변경될 때마다 해당 설정 파일을 사용하고 있는 서버에 일일이 refresh 엔드포인트를 요청해야하는 번거로움이 있습니다.
이 번거로움을 해결하기 위해 Spring Cloud Bus로서 RabbitMQ를 사용하여 명령어 하나를 보내면 해당 서버가 모두 업데이트 되는 방법을 정리해보려 합니다.
감사합니다.