해당 포스팅은 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의를 듣고 정리한 글입니다. 실습 환경을 따라하시려면 이전 글에 나온 실습을 진행하시고 해당 포스팅을 읽는 것을 추천드립니다.
외부 Config 정보 바꾸기는 3가지가 있다.
이전 포스트는 Actuator refresh까지 설명하였다.
Actuator refresh는 어플리케이션 서버가 1~2개면 문제가 되지 않지만 수백개의 서비스가 있을경우 각각의 어플리케이션마다 다 refresh를 수동으로 해줘야 하기 때문에 번거롭고 매우 귀찮은 일이다
이점을 보완하기 위해서는 Spring cloud bus
를 사용하면 된다. 이 방법은 한쪽에서 refresh를 config와 연결된 모든 서비스를 refresh를 해주는 방법이다.
상태 및 구성에 대한 변경사항을 연결된 노드에게 전달한다. (Broadcast)
Spring Cloud Bus 는 분산 시스템 환경, 마이크로서비스 환경에서 각각의 노드나 서비스를 연결시켜주는 경량 메시지 브로커이다.
Spring Cloud Bus 를 이용한다면 Configuration 들을 Broadcast 하게 변경 사항을 적용시킬 수 있다.
Spring Cloud Bus 는 SpringBoot Application 에 부착되어 설정 정보를 지속적으로 반영할 수 있게 한다.
더 쉽게 이해하기 위해서 아래 설정 정보 적용 과정을 함께 따라가보자.
설정 정보가 적용되는 과정은 다음과 같다.
Message Broker
로 변경된 설정 정보에 대한 Message 를 발행한다.AMQP : 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜
메시지 지향, 큐잉, 라우팅, 신롸성, 보안
Erlang, RabbitMQ에서 사용
Kafka
Apachec Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
분산형 스트리밍 플랫폼
대용량의 데이터를 처리 가능한 메시징 시스템
RabbitMQ ( 적은 수의 데이터 안전 )
메시지 브로커
초당 20+ 메시지를 소비자에게 전달
메시지 전달 보장, 시스템 간 메시지 전달
브로커, 소비자 중심
Kafka ( 대용량 )
초당 100k+ 이상의 이벤트 처리
pub/sub, Topic에 메시지 전달
Ack를 기다리지 않고 전달 가능
생산자 중심
결과로 HTTP POST/busrefresh 를 통해 연결된 모든 노드들을 refresh한다.
만약 user-service의 설정정보가 바꼈다고하면 아무서버에서 /busfresh를 하면 연결된 모든 노드를 refresh를 한다.
brew install rabbitmq
설치가 되면 (보통 설치 경로: /usr/local/sbin)
나는 /opt/homebrew/opt/rabbitmq/sbin
export PATH=$PATH:/usr/local/sbin
설치된 경로에서
rabbitmq-server
실행시키고 접속하게 되면 아래화면이 뜬다.
초기
모든 서비스에는 해당 디펜던시를 추가한다. (config, gateway, user등등)
Maven 기준
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
또한 연결된 모든 노드에 rabbitmq 설정정보를 추가합니다.
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
추가로 actuator 의 end point에 busrefresh를 추가해준다.
management:
endpoints:
web:
exposure:
include: refresh, health, beans, http, busrefresh, info, metrics, prometheus
모든 설정을 마쳤으면 마이크로 서비스를 유레카에 올리고
테스트를 해보자!
기존 유저서비스의 config 파일 내용은 아래 사진과 같다
테스트를 위해 token.secret의 값을 변경해보자
Postman을 통해 요청을 보낸뒤에 확인해면
변경된것을 확인 할 수있다.