MSA/구현

[MSA] Spring Cloud Config Client 구축 2 - 삽질중인 개발자

개발 N년차 2020. 11. 2. 23:09
반응형

- 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"라는 문구가 나오게 된다.

 

 

 

이렇게 하면 무중단으로 설정만 변경이 가능하다.

반응형