Spring Cloud Config Server 에서는 여러 Backend를 Environment Respository로 제공하고 있다.
그럼 document에 기술된 Backend 말고도 사용할수 있나?
라는 생각에 찾아봄.
Environment Repository 를 구현하여 Bean 으로 등록하기만 하면된다.
- 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 변경된 정보를 새로 잘 가져온다.
끝. 정리를 해야하는데… 후우..