[Spring Cloud Bus] Spring Cloud Bus 개념
Spring Cloud Bus란?
MSA구조에서 마이크로서비스를 메세지 브로커와 연결해주는 역할과 상태 및 구성에 대한 변경사항을 연결된 모든 마이크로서비스에게 전달해주는 프레임워크이다.
어플리케이션 설정파일 변경 시 Spring Cloud Config를 이용하면 어플리케이션 별도 빌드-배포 없이 적용 가능할 수 있다.
그러나 MSA 구조에서 Micro Service가 많아질 경우 서버 한개 한개 각각 개별적으로 actuator/refresh를 호출하여 적용하는 것은 실용적이지 못하고 누락의 가능성이 있다.
이러한 복잡하고 번거로운 점을 개선하고자 Spring Cloud Bus에선 손쉽게 적용할 수 있도록 도와준다.
Spring Cloud Bus는 분산 시스템의 노드(Micro Service)를 경량 메세지 브로커와 연결하여 상태 및 구성에 대한 변경사항을 연결된 노드에게 전달한다. 메세지 브로커로 사용되는 기술로는 kafka, rabbitMQ 등이 있다.
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들은 설정 정보를 업데이트 한다.
RabbitMQ 설치 및 실행
ERLANG_HOME 환경변수와 path 변수에 대해서 설정하고, rabbitmq를 설치하고 실행하는 과정에 대한 질문이시죠?
우선, ERLANG_HOME 환경변수를 설정하기 위해서는 다음과 같은 단계를 따르면 됩니다:
1. “내 컴퓨터”를 우클릭하여 속성을 선택하세요.
2. “고급 시스템 설정”을 클릭하세요.
3. “환경 변수” 버튼을 클릭하세요.
4. “시스템 변수”에서 “새로 만들기”를 클릭하세요.
5. 변수 이름에 “ERLANG_HOME”을 입력하고, 변수 값에 “C:\Program Files\Erlang OTP”을 입력하세요.
6. 확인을 눌러 설정을 저장하세요.
다음으로, path 변수에 %ERLANG_HOME%\bin을 추가하는 방법은 다음과 같습니다:
1. “환경 변수” 창에서 “Path” 변수를 선택하세요.
2. “편집” 버튼을 클릭하세요.
3. “새로 만들기”를 클릭하고, “%ERLANG_HOME%\bin”을 입력하세요.
4. 확인을 눌러 설정을 저장하세요.
이제 rabbitmq를 설치하고 실행하는 단계입니다.
1. rabbitmq command prompt를 실행하세요.
2. 다음 명령어를 순서대로 입력하세요:- rabbitmq-server -detached- rabbitmq-plugins enable rabbitmq_management
만약 위의 방법으로 설치와 실행이 제대로 되지 않는다면, 다음 명령어를 입력해보세요:
1. rabbitmq-service.bat remove
2. rabbitmq-service.bat install
3. rabbitmq-server -detached
4. rabbitmq-plugins enable rabbitmq_management
Spring Cloud Bus 구현
Spring Cloud를 구성하는 ApiGateway Service, Config Server, Micro Service 등등 모든 서비스에 dependency 적용
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
// config client
implementation 'org.springframework.cloud:spring-cloud-starter-config'
// config server
// implementation 'org.springframework.cloud:spring-cloud-config-server'
}
RabbitMQ에 Micro Service들이 각각의 노드로서 연결을 해주기 위해 application.yml파일에 RabbitMQ 정보를 입력해준다. 이 설정 또한 모든 Spring Cloud Service에 동일하게 적용해줘야한다.
또한, Spring Cloud Bus기능을 적용하기 위해 management.endpoints.web.exposure.include에 busrefresh 기능도 추가해준다. busrefresh는 기존의 refresh와 동일하게 설정파일의 변경이 적용되는 기능인데 한개의 서버가 아닌 모든 Micro Service에 적용해주기 위한 기능이다.
Config server - application.yml
server:
port: 8888
spring:
application:
name: config-service
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
profiles:
active: native
cloud:
config:
server:
native:
search-locations: file:\\\${user.home}\Desktop\Work\native-file-repo
git:
# uri: file:\\\D:\sabeom\3.study\git-local-repo # local git?? ?? ????
uri: https://github.com/sabumi2002/Spring-Cloud-Config # remote git?? ?? ????
# username: [your username]
# password: [your password]
management:
endpoints:
web:
exposure:
include: health, busrefresh
Config client(모든 클라이언트 동일) // 예시) apigatewat - application.yml
spring:
config:
import: "optional:configserver:http://localhost:8888/" # configserver에 대한 host 정보를 설정합니다.
application:
name: apigateway-service
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
cloud:
config:
# uri: http://localhost:8888/
name: config-service # 이 값으로 config server에 조회할 application-name으로 사용합니다.
fail-fast: true # config-server에 연결할 수 없는 경우 애플리케이션 구동에 실패합니다., retry 옵션을 사용하고자 하는 경우에 반드시 선언되어야 합니다.
retry: # config server에 연결 실패하거나 응답 에러가 발생하는 경우 재시도하는 정책입니다.
initial-interval: 1000 # config server api 요청 실패 후 다음 retry 요청을 위한 internal 입니다. 단위는 ms(밀리세컨드)입니다.
max-attempts: 5 # 최대로 retry하는 횟수 입니다.
multiplier: 1.1 # 한번 retry 할 때마다 interval 시간의 지연율을 곱합니다
request-connect-timeout: 2000 # config server 요청 시 사용하는 connection timeout 값입니다., 기본값은 10초 입니다.
request-read-timeout: 10000 # config server 요청 시 사용하는 read timeout 값입니다., 기본값은 185초 입니다.
management:
endpoints:
web:
exposure:
include: refresh, health, beans, httpexchanges, busrefresh
실제 값을 변경해보자
http://localhost:8000/user-service/actuator/busrefresh