一、概述
1. 基本介紹
Spring Cloud Bus 目前支持兩種消息代理:RabbitMQ、Kafka
Spring Cloud Config 配合 Spring Cloud Bus 使用可以實現配置的動態刷新
Spring Cloud Bus 用來將分佈式系統的結點與輕量級系統鏈接起來的框架,它整合了 Java 的事件處理機制和消息中間件的功能
2. 什麼是總線
在微服務架構的系統中,通常會使用輕量級的消息代理來構建一個共用的消息主題,並讓系統中所有微服務實例都連接上來。由於該主題中產生的消息會被所有實例監聽和消費,所以稱它為消息總線。在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息。
3. 基本原理
ConfigClient 實例都監聽 MQ 中同一個 topic(默認叫 springCloudBus)。當一個服務刷新數據時,會把這個信息放到 Topic 中,這樣其它監聽同一 Topic 的服務就能得到通知,然後去更新自身的配置。
二、使用
1. 環境準備
- 安裝 Erlang
- 安裝 RabbitMQ:
以 windowns 版本為例,下載安裝後,進入sbin目錄輸入以下命令啟動管理功能
瀏覽器輸入http://localhost:15672/進入管理頁面(用戶名密碼默認都是 guest)
2. 設計思想
bus 動態刷新全局廣播有兩種設計思想
- 利用消息總線觸發一個客戶端的 /bus/refresh,進而刷新所有客戶端的配置
- 利用消息總線觸發一個服務端 ConfigServer 的 /bus/refresh,進而刷新所有客戶端的配置
我們採用第二種,第一種方式不適合的原因有三:
- 打破了微服務的職責單一性。負責業務模塊的微服務不應該承擔配置刷新的職責
- 破壞了微服務各節點的對等性
- 有一定的侷限性。例如微服務遷移時,它的網絡地址常常發生變化,如果想要做到自動刷新,還需要增加更多的配置
3. 動態刷新全局廣播配置
①. 在配置中心微服務以及所有需要接收消息的客戶端中導入 Maven 依賴
<code><
dependency
><
groupId
>org.springframework.cloudgroupId
><
artifactId
>spring-cloud-starter-bus-amqpartifactId
>dependency
>/<code>
②. 添加對應配置,使其支持消息總線
<code>spring:
rabbitmq:
host:
localhost
port:
5672
username:
guest
password:
guest
management:
endpoints:
web:
exposure:
include:
'bus-refresh'
/<code>
③. 測試,修改 github 中的配置,使用 curl 發送請求 curl -X POST
http://localhost:3344/actuator/bus-refresh 後,刷新每個微服務的頁面發現都已被修改。實現了一次修改,廣播通知,處處生效!
2. 動態刷新定點廣播配置
如果不想全部通知,只想定點通知,上述的配置都不用變,只需要發送請求的時候在後面指定「微服名:端口」
<code>curl -X POSThttp:
//localhost:3344/actuator
/bus-refresh/
{destination}/<code>
以我的為例就是:
<code>curl -X POSThttp:
//localhost:3344/actuator
/bus-refresh/cloud
-config-client:
3355
/<code>
5. 流程圖
- ①. 配置中心微服務通過遠程庫獲取配置信息,同時訂閱 RabbitMQ 主題
- ②. 客戶端通過配置中心獲取配置信息,同時訂閱 RabbitMQ 主題
- ③. 當我們修改遠程庫的配置後
- ④. 發送 POST 請求
- ⑤. 配置中心向 RabbitMQ 發送刷新事件
- ⑥. 客戶端監聽到刷新事件
- ⑦. 從配置中心拉取新的配置
推薦閱讀:
為什麼大廠的面試題問的都是底層原理,前阿里P7架構師是這樣說的
java開發必知必會的技能,沒有系統掌握Kafka,你就缺少核心競爭力
2020還不會性能調優?啃下這20W字Java性能調優筆記,隨便漲薪13K!