JunsuLime / spring-cloud-native-explorer

Spring cloud explorer
1 stars 0 forks source link

새로고침 가능한 설정 #10

Closed JunsuLime closed 3 years ago

JunsuLime commented 3 years ago

중앙집중형 설정방식을 도입했지만, 아직 바뀐 설정정보가 즉시 반영되지못한다는 단점이 있다. 스프링 클라우드는 이를 해결하기 위해서 @RefreshScope 을 제공한다.

Documentation 따라가기

Environment 의 변경은 EnvironmentChangeEvent 를 통해 인지할 수 있으며 이를 이용하여

기본적으로 config client 는 Environment 의 변화를 감지하지않으며, Schedule 등으로 주기적 poll 하는 방식은 권장하지않는다. (Spring Eventbus 를 활용하는것을 추천)

EnvironmentChangeEvent 를 받으면 configuration properties 는 업데이트되지만, 이를 사용하여 만들어진 요소는 업데이트되지않는다. 이런 문제를 해결하기위해서 @RefreshScope 을 사용한다.

@RefreshScope 이 붙은 클래스는 설정서비스로부터 설정값을 새로 읽어와 다시 생성된다. RefreshScopeRefreshed 이벤트를 받아서 해당 동작을 한다. (완전 폐기후 다시 생성)

참고로 @RefreshScope 는 lazy 하게 동작하므로 이벤트 받을 시 바로 폐기 및 생성이 아니라, 해당 클래스가 사용될 때 폐기 및 생성이된다.

https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#refresh-scope

JunsuLime commented 3 years ago

위와 같은 방식의 설정값 refresh 는 각각의 client 에 호출하는 방식이므로, 클라이언트 어플리케이션이 여러개일 때 번거롭다. 스프링 클라우드 버스를 이용하여 설정 변경 내용을 여러 설정 클라이언트에 한 번에 적용할 수 있다.

https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/

메시지버스에 한번만 메시지를 발송하면 수천대의 마이크로서비스가 스스로 설정내용을 변경한다. 레빗엠큐를 사용하여 스프링 클라우드 버스를 사용해보자.

spring event 버스에 연결되면 이를 통해 이벤트를 전달 할 수 있다

https://github.com/JunsuLime/spring-cloud-native-tester-config/blob/master/cloud-tester.yml config 에 이벤트 버스의 구현체인 rabbitmq 정보를 넣어 일일이 설정하지않게해도 된다.