Micro Service/mSVC개발

[SC06] Spring Cloud Config Monitor 란 ?

Happy@Cloud 2021. 2. 14. 03:15

Config monitor 이해

WHY ?

config git repository의 config파일이 변경되면, 자동으로 MQ에 config 변경정보가 전송되고, MQ 채널을 구독한 각 마이크로서비스에게도 통보가 되어 동적으로 config변경 사항이 각 마이크로서비스에 반영되어야 합니다.

Spring Cloud bus는 이를 위한 방법을 제공하나, config git repository에 업로드 후 수동으로 MQ에 config 변경 정보를 요청해야 합니다.

즉, http://{config server host}/actuator/bus-refresh를 POST로 수행해야 합니다.

우리는 이를 자동화하기 위해 위 처리를 수행하는 application을 만들고, config git repository의 webhook으로 등록하였습니다.

Spring Cloud on kubernetes: 05. Clous bus를 참조하십시오.

Spring cloud config monitor는 별도의 webhook 어플리케이션 개발 없이, config server에 바로 요청할 수 있는 방법을 제공합니다.

Spring cloud config monitor는 git repository의 변경 사항을 통보 받기 위한 webhook end point를 제공하기 위해 필요합니다.

Spring Cloud on kubernetes: 05. Clous bus의 동작원리 그림에서 파란색box가 Spring Cloud Config Monitor입니다. 

 

HOW ?

config monitor 라이브러리를 추가하고, spring.cloud.bus.enabled=true로 지정하면 config server에 '/monitor'라는 end point가 생성됩니다.

git config repository의 webhook주소로 http://{config server host}/monitor를 지정하고, config파일 수정 후 push합니다.

webhook 주소가 호출되고, config server는 변경된 config 정보를 MQ에 전송(Publish)합니다.

그럼 MQ는 채널을 구독하고 있는 각 마이크로서비스에 변경이 있음을 통보하게 되고, 각 마이크로서비스는 config server를 통해 변경 내용을 동적으로 reload하게 됩니다.

 

Config monitor 적용 및 테스트

config monitor는 config server에만 적용하면 되며, Spring cloud bus를 먼저 적용해야 합니다.

아직, Spring cloud bus를 적용하지 않았으면 Spring Cloud on kubernetes: 05. Clous bus을 참조하여 작업하십시오.

 

1. config monitor 라이브러리 추가

pom.xml에 config monitor를 추가합니다.

stream-rabbit라이브러리는 bus-amqp라이브러리가 추가되어 있으므로, 불필요합니다. 있어도 동작엔 문제 없습니다.

		<!-- config-monitor -->
		<!--  <dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
		</dependency> --> <!-- bus-amqp만 있어도  -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-monitor</artifactId>			
		</dependency>

 

2. spring.cloud.bus.enabled 활성화

application.yaml에 spring.cloud.bus.enabled=true를 추가합니다.

spring:
  cloud: 
  ...
    # enable config monitor      
    bus:
      enabled: true

 

3. config git repository의 webhook설정

http://{config server ingress host}/monitor로 설정하고, Content type은 application/json으로 변경하십시오.

기존에 http://{webhook host}/bus-refresh로 등록한 webhook설정은 삭제하십시오.

 

4. 테스트

1) 사전준비

브라우저에서 webhook swagger page를 여십시오.

그리고, NFS서버 접근하여 config server의 로그를 실시간으로 열어 놓으십시오.  아래 명령어 이용하세요.

k logs -f config-0

 

2) config git repository의 webhook-dev.yaml변경 후 push

STS에 config git repository를 추가하고, STS의 git commit&push기능을 이용하면 편합니다.

Spring Tool Suite, Eclipse에서 git commit & push하기를 참조하세요.

 

3) config 서버 콘솔과 '/greeting' API테스트

webhook:dev와 webhook-dev라는 어플리케이션의 config를 refresh하려고 합니다.

하지만, 이런 이름의 어플리케이션에 대한 config는 없으므로 MQ에 전송할 내용은 없습니다.

따라서, '/greeting' API를 다시 테스트해도 변경한 greeting메시지는 나오지 않습니다.

 

왜 config monitor는 어플리케이션 이름을 엉뚱하게 찾는걸까요 ?

변경된 파일명을 이용하여 어플리케이션을 찾기 때문입니다.

우리가 수정한 파일명이 webhook-dev.yaml이기 때문에 config monitor는 대상 어플리케이션명을 아래 2개로 판단합니다.

- {변경된 파일명} => webhook-dev

- {변경된 파일명의 dash앞에 값}:{변경된 파일명의 dash뒤의 값} => webhook:dev

따라서, 갱신될 config를 찾지 못하게 되는것입니다.

어떻게 해결해야 할까요 ? 제일 쉬운 방법은 {application명}으로 파일을 하나 만들고, webhook-dev.yaml과 webhook파일을 모두 수정하는 방법입니다.

한번 해 보시면 아래와 같이 config서버 콘솔에 표시되고, greeting값도 제대로 반영될것입니다.

 

Config monitor 개선

그런데, config파일을 수정한 후 항상 해당 어플리케이션명으로 되어 있는 파일도 수정해야 하는것은 매우 번거롭습니다.

좀 더 아름다운 방법은 없을까요 ?

config monitor의 application명을 판단하는 class를 overriding하면 됩니다.

1. config monitor의 application명 판단 class 소스 복사

spring cloud config의 github페이지로 접근합니다.

github.com/spring-cloud/spring-cloud-config

 

spring-cloud/spring-cloud-config

External configuration (server and client) for Spring Cloud - spring-cloud/spring-cloud-config

github.com

spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor로 이동하여, PropertyPathEndPoint.java의 소스를 복사합니다.

 

2. PropertyPathEndpoint.java 소스 수정

아래와 같이 패키지 'org.springframework.cloud.config.monitor'를 만들고, 그 아래에 PropertyPathEndpoint.java를 만듭니다.

그리고, 복사한 소스를 붙여넣기 합니다.

마지막으로, 네모친 부분을 추가합니다. 수정한 파일명에서 dash앞 부분을 어플리케이션명 리스트에 추가하는 수행입니다.

 

3. overriding 허용 옵션 추가

spring cloud의 class들은 서버 시작 시 spring bean으로 생성되어 등록됩니다.

spring bean으로 만들어지는 class들은 기본적으로 overriding할 수 없습니다.

application.yaml에 아래 옵션을 추가하여 overrinding을 허용하십시오.

spring:
  ...  
  main:
    allow-bean-definition-overriding: true  

 

git repository로 push합니다.

 

4. config server 재배포

NFS서버에서 hklee 유저로 접속하여, git pull하여 새 소스를 다운로드한 후 run-cicd로 배포합니다.

[root@nfs ~]# su - hklee
마지막 로그인: 토  1월 16 03:50:44 CST 2021 일시 pts/0
[hklee@nfs ~]$ cd work/config

[hklee@nfs config]$ git pull
...

[hklee@nfs config]$ run-cicd hklee passw0rd . dev . java

 

5. 테스트

webhook-dev.yaml파일만 수정하고, push한 후 config서버 콘솔과 '/greeting' API를 테스트합니다.

 

이렇게 webhook-dev.yaml의 greeting값이 webhook어플리케이션에 바로 반영이 된다면 성공입니다.

configmng의 webhook밑에 있는 webhook파일은 이제 불필요하므로 삭제합니다.