[MSA] Spring Cloud Config Client 구축 2 - 삽질중인 개발자
- Spring Cloud Config Refresh 방법 -
Spring Cloud Config Client Aplication을 server에 연동했다면 설정이 변경되었을 때 설정을 Refresh 해야 한다.
가장 간단한 방법은 그냥 application 을 종료 후 재실행을 하면 되지만 이러면 종료되는 시간 동안 서비스가 중단이 된다.
그래서 서버를 중단하지 않고 설정값만 변경을 해야 하는데 이때 필요한 게 Spring Boot Actuator이다.
1. Spring Cloud Config Client 측에 Spring Boot Actuator 관련 의존성 추가
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
2. 기존 config server에 있는 service-dev.yaml 파일 변경 ( 이 포스트의 5번 과정에 사용된 파일)
server:
port: 8096
management:
endpoints:
web:
exposure:
include: ["env", "refresh"]
announcement:
hi : 안녕
management 속성 값은 Actuator 관련 설정이고
announcement.hi 는 테스트용 설정 property이다.
※ config 서버는 properties를 git에서 가져오기에 위에서 설정한 파일이 git에 push 가 되어 있어야 한다.
3. 컨트롤러 및 Config 파일 추가
@ConfigurationProperties에 대한 설명은 링크를 읽어보면 된다.
@RefreshScope는 Actuator를 통하여 refresh 할 대상을 설정하는 어노테이션이다.
@RefreshScope 가 없으면 Actuator에 refresh 명령을 내려도 설정 값이 변하지 않는다.
package com.project.service.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "announcement")
@RefreshScope
public class AnnouncementProperties {
private String hi;
public String getHi() {
return hi;
}
public void setHi(String hi) {
this.hi = hi;
}
}
package com.project.service.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.project.service.properties.AnnouncementProperties;
@RestController
public class TestRestController {
@Autowired
private AnnouncementProperties announcementProperties;
@GetMapping("/test")
public String test() {
return announcementProperties.getHi();
}
}
4. 설정 변경 테스트
프로젝트를 실행하고 localhost:8096/test를 들어가면 "안녕"이라는 문자가 뜬다.
이제 2번의 설정 파일을 다음과 같이 변경하자
server:
port: 8096
management:
endpoints:
web:
exposure:
include: ["env", "refresh"]
announcement:
hi : hi
annoannouncement.hi 가 기존 "안녕"에서 "hi"로 변경이 되었다.
git push를 해준 후 다시 localhost:8096/test에 들어가면 그대로 "안녕" 이 출력되는 화면을 볼 수 있다.
위의 결과를 토대로 properties 파일을 아무리 변경해도 프로젝트가 재실행되기 전에는 설정 값이 변하지 않는다는 걸 알 수 있다.
이런 설정값을
POST localhost:8096/actuator/refresh로 POSTMAN이나 CURL로 호출한다면
아래 그림과 같이 기존 설정에 비해 변경된 값이 출력될 것이다.
이제 다시 localhost:8096/test를 들어가면 "안녕"이라는 문구 대신 "hi"라는 문구가 나오게 된다.
이렇게 하면 무중단으로 설정만 변경이 가능하다.