woonizzooni

Spring Cloud Bus 동작 확인 본문

Spring

Spring Cloud Bus 동작 확인

woonizzooni 2019. 7. 6. 15:41

TL;DR

 

> 구현체 / 참고 소스

https://github.com/woonizzooni/spring-cloud-config-concept

 

> 실행 환경

 - RabbitMQ 실행 (Docker 활용)

 - 로컬저장소 vs GitHub저장소 방식 선택

   'GitHub 저장소 & WebHooks 설정' or '로컬저장소 & 'POST /monitor'' 방식 

 - Config서버, 2개 이상의 Client 실행 (bus활성화)

 
> 동작 확인

 - 외부 저장소의 특정 앱의 설정파일 수정

 - GitHub 저장소 이용 방식의 경우 자동으로  특정 앱의 설정 갱신이 이뤄지는지 확인

 - 로컬 방식의 경우 Config서버로 'POST /monitor' 요청 후 

   특정 앱의 설정 갱신이 이뤄지는지 확인


Spring Cloud Bus

https://spring.io/projects/spring-cloud-bus

https://spring.io/projects/spring-cloud-bus#learn

https://spring.io/projects/spring-cloud-bus#samples

 

 

이전 게시글 "Spring Cloud Config의 동작"에서는

외부에 있는 특정 앱 설정 파일 변경시 특정 앱에 refresh하라고 직접 요청했었는데,

Spring Cloud Bus를 사용해서 자동 갱신되는 기능을 확인해본다.

 

 

#learn Doc에서 SpringCloudBus를 '분산시스템 노드간 메시지브로커와의 링크/연결'로 소개.

AMQP broker과 kafka를 지원하는 듯 하고, 어디선가 보면 redis도 지원한다던데

AMQP 구현체 중 rabbitmq를 선택해서 확인해보자.

 

0. 구현체 / 참고 소스

https://github.com/woonizzooni/spring-cloud-config-concept

cloud-bus-config-server 
cloud-bus-config-client-customer-service 
cloud-bus-config-client-product-service

 

1. 구동 환경 관련

 - RabbitMQ 구축/실행 : 도커 컨테이너를 활용하자. (웹 관리자 화면은 15672포트, 연동은 5672포트)

   https://hub.docker.com/_/rabbitmq

docker run -d --name rabbitmq \
-p 5672:5672 -p 15672:15672 --restart=unless-stopped \
-e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password \
rabbitmq:3-management

 

 - 본인PC에서 동작 확인하고 싶은데 GitHub의 WebHooks연동에 문제가 있다면 로컬환경으로 확인하자.

   * Config서버 서비스 포트가 공인만에 노출될 수 있어야 함.

   * cloud-bus-config-server/src/main/resources/bootstrap.yml : 각 경우별 선택 예

[1] GitHub저장소의 Webhooks 이용시 [2] 로컬환경(개인 PC-사설망)에서 테스트
....
spring
  #profiles: 
  #  active: native 
  cloud
    config
      #server: 
      #  native: 
      #    search-locations: D:/Workspace/spring-cloud-config-concept/repos.d 
      server
        git
          urihttps://github.com/woonizzooni/spring-config-repo
....
....
spring: 
  profiles: 
    active: native 
  cloud: 
    config: 
      server: 
        native: 
          search-locations: D:/Workspace/spring-cloud-config-concept/repos.d 
      #server: 
      #  git: 
      #    uri: https://github.com/woonizzooni/spring-config-repo
....

 

 

2. 앱 구동시 동작 과정

  1) Config서버 : 설정파일 위치를 내 로컬 or github로 설정, rabbitmq에 springCloudBus 토픽 생성&구독

  2) Client (고객/상품) : Config서버로 설정파일 요청, rabiitmq의 springCloudBus 토픽 채널 구독

   ** 3번의 로딩이 이뤄졌는데 이 중 health indicator는 off시켜서 1개는 제거함 **

동작 확인 중에 dev/prod/stg등으로 profile 구분했더니 client의 자동갱신이 동작되지 않더라.

로그레밸 debug로 켜고 확인해보니 확실히 rabbitmq로부터 이벤트 메시지는 수신된 것이 확실하나,

spring boot 앱이 갱신을 하지 않는 것! 

 

나와 유사한 경우를 찾아봤다.

"Bus client with multiple active profiles does not match RemoteApplicationEvent #62"

https://github.com/spring-cloud/spring-cloud-bus/issues/62

처음부터 application-dev.yml등으로 확인했으니 default(application.yml) 동작을 확인해봤다.

오~ 동작하네!  자동갱신이 이뤄졌다. 

profile구분된 경우 app이 이벤트를 수신했으나, 뭔가? match되지 않아 갱신하지 않았던 것 같다.

버근가 내 환경 탓인가... 싶다가 그냥 default라도 동작확인했으니 일단 넘어가자.

 

 

3. 특정 서비스 앱의 설정 변경시 해당 앱 설정 갱신 동작 확인

  1) 로컬 환경 구성인 경우

    - 고객서비스앱의 현재 설정 상태 확인

    - 고객서비스 앱 설정 파일 수정

    - Config서버로 POST메소드로 /monitor 호출

      curl예)

curl -v -X POST "http://localhost:10010/monitor" \
  -H "Content-Type: application/json" \
  -H "X-Event-Key: repo:push" \
  -H "X-Hook-UUID: webhook-uuid" \
  -d '{"push": {"changes": []} }'

    - springCloudBus토픽 구독 등록한 앱에 이벤트가 수신되는지 확인 (debug 로그로 확인 or 패킷으로)

    - 고객서비스 앱만 갱신하는지 확인 (Config서버로 요청하는지)

 

  2) GitHub 저장소 WebHooks 구성인 경우

    - 저장소의 WebHooks url등록 

      ㄱ. Payload URL : Config서버 /monitor 등록 (예: http://my_config_server:8080/monitor)

          ** bus-refresh 등록하면 안됨. monitor여야 함 **

      ㄴ. Content type: application/json 선택

      ㄷ. 트리거 기준 선택 (just the push event)

    - GitHub저장소의 설정 파일 수정 (push or commit등)

    - Config서버 : Github로부터의 /monitor 요청 수신으로 RabbitMQ와의 이벤트 송/수신 상태 확인

    - springCloudBus토픽 구독 등록한 앱에 이벤트가 수신되는지 확인 (debug 로그로 확인 or 패킷으로)

    - 고객서비스 앱만 갱신하는지 확인 (Config서버로 요청하는지)

 

[참고]

https://spencer.gibb.us/blog/2015/09/24/spring-cloud-config-push-notifications/

https://github.com/spring-cloud/spring-cloud-bus

https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#config-first-bootstrap

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

https://stackoverflow.com/questions/44122251/list-final-list-of-properties-spring-cloud-config-server

https://github.com/spring-cloud/spring-cloud-bus/issues/62

https://github.com/spring-cloud/spring-cloud-config/issues/733

 

Comments