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官方推薦下載地址:https://www.erlang-solutions.com/resources/download.html
RabbitMQ 安裝
下載地址:https://www.rabbitmq.com/install-windows.html#installer
安裝完成在工作管理員中的服務可以看到
配置RabbitMQ
-
進入RabbitMQ安裝目錄下的 sbin 目錄
-
安裝RabbitMQ-Plugins,啟動管理功能
在當前目錄下啟動 cmd
rabbitmq-plugins enable rabbitmq_management
服務啟動後,訪問 http://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 "http://localhost:3344/actuator/bus-refresh"
定點通知
指定某些例項生效而不是全部
http://localhost:配置中心埠號/actuator/bus-refresh/{destination}
/bus/refresh請求不再傳送到具體的服務例項上,而是發給 configserver 通過 destination 引數類指定需要更新配置的服務或例項
我們這裡以重新整理執行在3355埠上的config-client為例,只通知3355,不通知3366
http://localhost:配置中心埠號/actuator/bus-refresh/服務名:埠號
curl -X POST http://localhost:3344/actuator/bus-refresh/Config-client:3355