Spring Cloud Config 정리, refresh manually

Circlee7
5 min readFeb 11, 2019

--

  1. Config Server , Custom EnvironmentRespository
  2. Config Client, @RefreshScope refresh without actuator

Spring Cloud Config Server 에서는 여러 Backend를 Environment Respository로 제공하고 있다.

그럼 document에 기술된 Backend 말고도 사용할수 있나?
라는 생각에 찾아봄.

Environment Repository 를 구현하여 Bean 으로 등록하기만 하면된다.

  1. Config Server , Custom EnvironmentRespository

cloud config client 에서 config server 로 property 를 찾을 때
applicationName, profile, label 을 통해 찾게된다.

(소스의 EnvRepository 는 Map으로 임시 구현한 Property 저장 객체다.)

Config Server 를 웹 어플리케이션으로 만들어서 rest api 를 통해 property 정보를 변경할 수 있다.

2. Config Client, @RefreshScope refresh without actuator

Spring Cloud Config Client 에서 bootstap.properties 를 통해 Config Server 를맵핑하면 등록한 커스텀 Environment Repository 로부터 property 정보를 가져오는 것을 확인할 수 있다.

또한 Config Server가 변경될 경우 client 에서 RefreshScope 어노테이션이 붙은 Bean 에 대해 Config Server의 변경정보를 참조하여 Bean을 다시 리로드 할 수 있다.

Client Server 의 RefreshScope 빈을 다시 리로드 하기 위해서는
spring boot actuator 의존성 추가 후
POST /actuator/refresh or /refresh 를 호출하면 refresh 할 수 있다고 한다.

actuator 는 별도의 security model을 가지고 있기 때문에 어플리케이션을 제어하는 actuator 엔드포인트들에 대한 안전을 확보할 수 있다.

! 그러다 보니 의문! actuator 를 통해서만 refreshScope를 사용할수 있는걸까?

… 라는 의문으로 RefreshEnpoint 를 찾아보았다.

…refresh는 actuator 에 존재하지 않는다.. 잉..
refreshScope 와 refreshEndpoint는 actuator 와 의존관계가 없다.

context에서 EnvironmentChangeEvent 이벤트를 발생시키면 된다.

하지만 , property 를 다시 가져와 적용하여 빈을 다시 등록해야 한다.

RefreshEnpoint를 보면.

ContextRefresher 를 통해 refresh 메소드를 호출하고 있다.

refresh 메소드는 refreshEnvironment를 호출한다.

refreshEnvironment 를 봐보자.

  • 먼저before 변수로 현재 컨텍스트에서 프로퍼티 소스를 가져온다.
  • addConfigFilesToEnvironment메소드에서는 현재 설정 정보로
    새로운 어플리케이션 컨텍스트를 생성한다.
    이때 cloud-config로 부터 다시 property를 가져와서 셋팅하게 된다.
  • 변경 key들에 대한 EnvironmentChangeEvent 를 발생시킨다.

그래서… cloud-config client 서버에서 api를 통해 property 정보를 가져오는 로직에 파라미터로 refresh 하는 기능을 적용 해보았다.

config server 변경된 정보를 새로 잘 가져온다.

github에 올려두었다.

끝. 정리를 해야하는데… 후우..

--

--

Circlee7
Circlee7

No responses yet