Spring Cloud Bus를 활용하는 이유
Spring Cloud Config Server - Client로 설정 정보를 변경할 수 있지만, 변경되는 Client의 Spring Boot Actuator Refresh API 호출을 통해 변경된 사항들을 로딩해줘야합니다.
설정 정보가 변경 되었을 때 모든 마이크로 서비스에 정보를 다시 로딩하라고 요구하는 것은 어떤 서비스가 어떤 설정 정보를 갖고 있는지 체크하는 것이 번거롭기도하고 실수로 중요한 설정을 변경하지 않으면 오류의 확률도 생깁니다.
이럴때 Spring Cloud Bus를 활용하면 변경 내용을 감지하고 자동으로 Cloud Config Client의 Refresh API를 호출할 수 있습니다. 동적으로 설정 정보를 변경하기 위한 Message Queue에 Config Client(설정 정보 연결 노드)들이 연결되어 있어야하고, Cloud Bus에 연결된 마이크로 서비스를 호출하게 되면 다른 서비스들도 설정 정보가 변경됩니다.
Rabbit MQ(Docker 기반)
메시지 지향 미들웨어를 위한 개방형 표준 응용 프로토콜인 AMQP를 활용하는 애플리케이션입니다.
도커로는 설치와 실행, 백그라운드 실행이 매우 쉽습니다. 이왕이면 도커로...
# windows 기준, 줄바꿈 명렁어 (^), linux 기준 (\)
docker run -d --name rabbitmq --restart always ^
-p 15672:15672 -p 5672:5672 -p 15671:15671 -p 5671:5671 -p 4369:4369 ^
-e RABBITMQ_DEFAULT_USER=guest ^
-e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management
# 5672 -> rabbitMq, 15672 -> admin web page, 4369 -> EMPD, 5671 -> TLS
Rabbit MQ(Windows 기반)
Erlang은 RabbitMQ의 핵심적인 실행 환경을 제공하므로, RabbitMQ를 설치할 때 Erlang/OTP가 필수적입니다.
윈도우는 rabbitMq와 Erlang/OTP 패키지가 분리되어 있어 사전 설치가 필요합니다.
Erlang 설치
https://www.erlang.org/downloads
Erlang 설치후 환경변수 설정
rabbit mq 다운로드
https://rabbitmq.com/install-windows.html#installer
백그라운드 실행
rabbitmq-server -detached
관리자 웹 페이지 설정
rabbitmq-plugins enable rabbitmq_management
플러그인 설정하면 http://localhost:15672로 관리자 웹페이지에 접근할 수 있습니다.
ID : guest
PW : guest
만약 접근이 안되면 서비스 삭제 후 다시 위의 과정을 반복하시면 됩니다.
rabbitmq-service.bat remove
rabbitmq-service.bat install
Config Server & Cloud bus
Config Server
의존성 추가
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bus-amqp'
application.yml
spring:
application:
name: config-service
rabbitmq: # rabbit mq
host: 127.0.0.1
port: 5672 # amqp port
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: health, busrefresh # cloud bus refresh
Config Client
의존성 추가
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bus-amqp'
application.yml
spring:
application:
name: user-service
rabbitmq: # rabbit mq
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: refresh, health, beans, busrefresh # cloud bus refresh
위의 설정을 완료하면 Cloud Config에 등록된 Micro service에 POST actuator/busresfresh API 호출을 하게되면 Cloud Bus에 등록된 다른 서비스에도 설정 변경이 적용됩니다.
예시
User service의 helath check 컨트롤러입니다.
@GetMapping("/health_check")
public String status(){
return String.format("It's Working in User Service on PORT %s, token secret : %s, token time : %s" ,
environment.getProperty("local.server.port"), environment.getProperty("token.secret"),
environment.getProperty("token.expiration_time"));
}
Cloud Config 에서 관리하는 application 변경
token:
expiration_time: 86400000
secret: BusBuscD08xCg+eiWnntQyYKCF/ZE7h9FbF5lN8DsNCZJVGN1IsXREyEmI/o4fEpqRYqL6eIQfFE/h6RFaQ4vQALY84Q==
gateway:
ip: 192.168.0.71
Git Commit & Push
git add ecommerce.yml
git commit -m "feat: change to use cloud bus"
git push
API Gateway 서비스에 Bus Refresh
Cloud Client인 API Gateway 서비스에 bus Refresh API를 호출해도 User service에서 설정이 변경하는지 확인하기 위해 API Gateway 서비스에 호출합니다.
API Gateway에 bus refresh 호출시에 cloud bus를 통해 user service에도 refresh가 호출되어 토큰이 변경되어 접근되지 않습니다.
재로그인을 통해 변경된 토큰 키로 만든 토큰으로 health check
흐름
1. Cloud Config Server 관리하는 설정 정보 변경(깃, 로컬파일)
2. Cloud Bus에 연결된 Micro Service에 POST /acutator/busrefresh API 호출
3. Cloud Bus에 연결된 다른 Micro Service에도 refresh 호출되어 설정 정보 변경
정리
Config 정보를 관리하는 서버, Config 정보를 받아보는 클라이언트로 나뉘고, 클라이언트는 변경된 Config 정보 로딩을 위한 Spring Boot Actuator Refesh, Cloud Config 설정 정보 자동 동기화를 위한 Cloud Bus까지, MSA 세계는 너무 방대한 것 같습니다;; 많은 기술을 활용하는 만큼 기술의 목적을 잊지 않기 위해 꾸준히 정리하겠습니다.