Backend/Spring Cloud

Spring Cloud Bus

야뤼송 2022. 6. 28. 13:48
반응형

1.Spring Cloud Bus란?

 

앞서 포스팅에서 언급한 것과 같이 어플리케이션 설정 파일의 변경 시 별도 빌드-배포 없이 Spring Cloud Config를 이용하면 어플리케이션의 빌드-배포 없이 적용 가능한 것을 확인할 수 있었다.

 

그러나 MSA 구조에서 Micro Service가 많아질 경우 서버 한개 한개 각각 개별적으로 actuator/refresh 호출하여 적용하는 것을 현실적으로 쉽지 않고 누락의 가능성도 있다.

 

이러한 복잡하고 번거로운 점을 개선하고자 Spring Cloud Bus를 이용할 경우 손쉽게 적용할 수 있다. Spring Cloud Bus는 분산 시스템의 노드를(Micro service)를 경량 메시지 브로커와 연결하여 상태 및 구성에 대한 변경 사항을 연결된 노드에게 전달하는 것을 말한다. 메시지 브로커로 사용되는 기술로는 kafka, RabbitMQ 등등이 사용된다.

 

2. Spring Cloud Bus의 적용 순서

 

Spring Cloud Bus를 이용한 변경 감지 및 설정파일 적용 순서는 다음과 같다.

 

1. 설정파일의 수정(git, native repository 등등)

2. Spring Cloud Bus가 연결된 서버로 /actuator/busrefresh 호출.
Sping Cloud가 연결된 서버인 Config server, Apigateway Server, Micro Service 등등 어떠한 서버로 busrefresh를 요청해도 동일하게 동작한다.

3. busrefresh를 통해서 설정파일이 변경되었음을 통보 받은 Config Server는 변경된 환경설정 정보를 다시 갱신.

4. Spring Cloud Bus에서는 변경 내용 변화를 RabbitMQ로 메시지를 발행한다.

5. RabbitMQ는 각각의 Client, 즉 Micro Service들에게 메시지를 Push한다.

6. 메시지를 구독받은 Micro Service들은 설정 정보를 업데이트 한다.

 

3. Spring Cloud Bus 구현 - RabbitMQ 설치

 

먼저 Spring Cloud Bus 구현에 앞서 RabbitMQ의 설치를 간단하게 알아보자.

 

Mac 환경에서의 설치이므로 윈도우 환경은 공식 홈페이지를 참고한다. mac의 homebrew 기능을 이용하면 손쉽게 설치가 가능하다.

터미널을 열고 나서 brew의 최신화를 위해 update를 수행한다.

$ brew update

 

Update 완료 후 rabbitmq install 명령어를 수행하면 간단하게 설치가 완료된다.

$ brew install rabbitmq

 

포그라운드에서 RabbitMQ를 실행하기 위해서는 단순히 터미널에 rabbitmq-server를 입력하면 서비스가 실행된다.  백그라운드 환경에서 실행을 하고 싶으면 brew services start rabbitmq 명령어를 실행한다.

#포그라운드에서의 실행
$ rabbitmq-server

#백그라운드에서의 실행
$ brew services start rabbitmq

#백그라운드에서의 실행 중지
$ brew services stop rabbitmq

 

RabbitMQ 실행 후 GUI 환경의 관리화면을 제공한다. 접속하는 방법은 기본 port로 설정된 15672로 웹 화면에서 접근하면 접속이 가능하다. http://localhost:15672로  접근 후 username/password의 경우 초기값인 guest/gutest로  로그인 할 수 있고 RabbitMQ의 상태 및 정보를 콘솔을 통해 확인할 수 있다.

 

4. Spring Cloud Bus 구현 

 

Spring Cloud Bus AMQP 기능을 이용하기 위해 Dependency를 추가해준다. 해당 라이브러리는 Spring Cloud를 구성하는 APIGATEWAY Service, Config Server, Micro Service 등등 모든 서비스에 적용을 해줘야 한다.

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

 

RabbitMQ에 Micro Service들이 각각의 노드로서 연결을 해주기 위해 application.yml파일에 RabbitMQ 정보를 입력해준다. 이 설정 또한 모든 Spring Cloud Service에 동일하게 적용해줘야한다. 

또한, Spring Cloud Bus기능을 적용하기 위해 management.endpoints.web.exposure.include에 busrefresh 기능도 추가해준다. busrefresh는 기존의 refresh와 동일하게 설정파일의 변경이 적용되는 기능인데 한개의 서버가 아닌 모든 Micro Service에 적용해주기 위한 기능이다.

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, httptrace, busrefresh

 

5. Spring Cloud Bus를 이용한 설정파일 변경 적용 

 

Spring Cloud Bus 테스트 방법은 간단하다. 먼저 RabbitMQ 서버를 기동 후 eureka, gateway service, Micro service 순으로 서비스를 기동한다.

 

서비스 기동 시 Console Log를 통해 각각의 Micro Service들이 RabbitMQ에 연결됨을 확인할 수 있다.

 

서비스 기동이 완료되고 나서 설정 파일을 내용을  변경하고 Postman을 이용하여 /actuator/busrefresh를 호출한다. busrefresh를 호출 후 정상적으로 호출이 완료되었으면 http.status 응답 값으로 204값을 리턴받게 된다.

 

busrefresh 호출 후 각각의 apigateway server, Micro service Log에는 설정정보가 갱신되었다는 내용을 확인 할 수 있다.

User-Service
API GATEWAY Service

실제로 값을 변경 후  DEBUG 모드를 통해  변경된 값이 정상 적용되었는지 확인해보자.  config-server로 /busrefresh를 보내고 나서

Gateway servicd, User service 모두 아래 이미지와 같이 변경됨을 확인할 수 있다.

 

해당 내용은 인프런 이도원님의 "Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)"를 듣고 정리한 내용입니다.
반응형