SpringCloud(六)Bus消息匯流排
- 2021 年 5 月 4 日
- 筆記
- SpringCloud
Bus 消息匯流排
概述
分散式自動刷新配置功能
Spring Cloud Bus 配合 Spring Cloud Config使用可以實現配置的動態刷新
Bus支援兩種消息代理:RabbitMQ和Kafka
Spring Cloud Bus是用來將分散式系統的節點與輕量級消息系統鏈接起來的框架,它整合了Java的事件處理機制和消息中間件的功能
SpringCloud Bus能管理和傳播分散式系統間的消息,就像一個分散式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通訊通道
匯流排概念
在微服務架構的系統中,通常會使用輕量級的消息代理來構建一個共用的消息主題,並讓系統中所有微服務實例都連接上來,由於該主題中產生的消息會被所有實例監聽和消費,所以稱它為消息匯流排
在匯流排上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息
基本原理
ConfigClient實例都監聽MQ中同一個topic(默認是springCloudBus)。當一個服務刷新數據的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置
RabbitMQ 環境配置
Erlang 安裝
RabbitMQ官方推薦下載地址://www.erlang-solutions.com/resources/download.html
RabbitMQ 安裝
下載地址://www.rabbitmq.com/install-windows.html#installer
安裝完成在任務管理器中的服務可以看到
配置RabbitMQ
-
進入RabbitMQ安裝目錄下的 sbin 目錄
-
安裝RabbitMQ-Plugins,啟動管理功能
在當前目錄下啟動 cmd
rabbitmq-plugins enable rabbitmq_management
服務啟動後,訪問 //localhost:15672(默認地址)
默認帳號:guest,默認密碼:guest
全局廣播
演示廣播效果,增加複雜度,再創建一個客戶端,現在擁有兩個客戶端,一個服務端
設計思想
-
第一種:利用消息匯流排觸發一個服務端ConfigServer的/bus/refresh端點,而刷新所有客戶端的配置
-
第二種:利用消息匯流排觸發一個客戶端/bus/refresh,而刷新所有客戶端的配置
對比兩種設計思想,第一種更合適
第二種不適合的原因:
- 打破了微服務的職責單一性,因為微服務本身是業務模組,它本不應該承擔配置刷新的職責
- 破壞了微服務各節點的對等性
- 有一定的局限性。例如,微服務在遷移時,它的網路地址常常會發生變化,此時如果想要做到自動刷新,那就會增加更多的修改
服務端
- 增加 pom 依賴
<!-- 消息匯流排 RabbitMQ 支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置 yml 文件
spring:
application:
name: Config-center
# rabbitmq 相關配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guset
# rabbitmq 相關配置,暴露 bus 刷新配置的端點
management:
endpoints:
# 暴露 bus 刷新配置的端點
web:
exposure:
include: 'bus-refresh'
客戶端
- 增加 pom 依賴
<!-- 消息匯流排 RabbitMQ 支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置 yml 文件
spring:
application:
name: Config-client
# rabbitmq 相關配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guset
修改github上application的內容,發送一次 POST 請求,實現全局修改,直接在 服務端 發送請求,即可達到全局修改
curl -X POST "//localhost:3344/actuator/bus-refresh"
定點通知
指定某些實例生效而不是全部
//localhost:配置中心埠號/actuator/bus-refresh/{destination}
/bus/refresh請求不再發送到具體的服務實例上,而是發給 configserver 通過 destination 參數類指定需要更新配置的服務或實例
我們這裡以刷新運行在3355埠上的config-client為例,只通知3355,不通知3366
//localhost:配置中心埠號/actuator/bus-refresh/服務名:埠號
curl -X POST //localhost:3344/actuator/bus-refresh/Config-client:3355