MSA구조에서 micro서비스를 메시지 브로커와 연결해주는 역활과 상태및구성에 대한 변경사항을 연결된(메시지브로커와)모든 micro서비스에게 전달(broadcast방식) 해주는 프레임워크이다.
서비스들이 많아질 경우 변경사항들을 모든 서비스들에게 refresh해주어야 한다.(post방식으로)
이러한 문제를 해결해주는 것이 바로 Spring Cloud Bus이다.
Publisher(송신자)로부터 전달받은 메시지를 Subscriber(수신자)로 전달해주는 중간 역할이며 응용 소프트웨어 간에 메시지를 교환할 수 있게 한다.
이때, 메시지가 저장(적재)되는 공간을 메시지 큐라고 하며, 메시지의 그룹을 topic(토픽)이라고 부른다. 그런데, 메시지를 교환할때, HTTP를 사용하지 않고 AMQP라는 메시지 지향 프로토콜을 사용하게 된다.
Producer(Publisher): 메시지를 보내는 곳
Consumer(Subscriber): 메시지를 받는 곳
Exchange: Producer로부터 메시지를 수신하는 곳. 수신한 메시지를 큐에 분배한다.
Queue: 메시지를 저장하는 곳. 저장했다가 Consumer에게 전달한다.
Binding: Exchange와 Queue의 mapping. 1:1 또는 1:N.
출처: https://preamtree.tistory.com/172 [Preamtree의 행복로그:티스토리]
Exchange가 Producer로부터 메시지를 받고 Queue에 전달한다. Queue는 Consumer에게 메시지를 전달한다.
AMQP의 정의는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜이다.
메시지 지향 미들웨어란 응용소프트웨어(프로세스,프로그램 등)간의 데이터 통신을 위한 소프트웨어이다. 많은 메시지 지향 미들웨어가 메시지 큐 시스템을 기반으로 구현되어 있다.
즉, 메시지 지향 미들웨어를 사용해 데이터 통신을 하기 위해 사용되는 프로토콜이 바로 AMQP인 것이다.
RabbitMQ는 AMQP 프로토콜을 구현한 메세지 브로커이다.
각 서비스들에 rabbitmq를 적용하기 위해서는 설정파일을 추가해야 한다.
(설정할때, rabbitmq의 포트는 5672이다. 대쉬보드로 들어가는 포트는 15672이다.)
- rabbitmq를 적용하기 위한 과정
- busrefresh를 config의 endpoint에 넣어주기(busrefresh를 post방식으로 보내면 rabbitmq와 연결된 모든 서비스들의 설정들이 변경된다)
- rabbitmq 속성 추가
rabbitmq: host: 127.0.0.1 port: 5672 # rabbitmq의 포트번호 username: guest password: guest
- 적용방법
post방식으로 actuator/busrefresh를 해주면 된다. => 이 과정이 설정정보가 변경되었음을 endpoint에 도달한 서버에게 알려주는 과정이다.
알림을 받은 서버는 설정정보를 갱신하고 메시지 브로커가 해당 설정정보를 구독(spring cloud bus와 래빗mq를 등록한 app들)한 app들에게 브로드케스팅한다. 이후 spring cloud bus는 각각의 app들에게 설정 정보를 반영한다.
위의 과정을 보면 다음과 같다.
1. 사용자가 /actuator/busrefresh를 호출(post방식)(postman과 같은 도구 혹은 진짜 호출)
2. 해당 호출을 받은 client는 rabbitmq와 연결된 모든 client들에게 설정값 갱신을 알림
3. 설정값을 갱신
여기서 publisher는 spring cloud config서버인 것이고, Consumer는 client들인 것이다.