SpringCloud系列第09節之訊息匯流排Bus
其中提到,每次熱載入屬性時,都要逐次呼叫每個應用的 /refresh
介面(或者維護 Git 倉庫的 Webhooks)來觸發屬性更新
隨著系統的擴充,應用的增加,若所有的觸發動作都要手工去做(或者維護 Git 倉庫的 Webhooks),這是不人道的
所以我們希望配置中心的屬性發生變化時,能有一種途徑去通知所有的相關應用去自動重新整理配置
而通過 Spring Cloud Bus 就能夠實現以訊息匯流排的方式,通知叢集上的應用,去動態更新配置資訊
本文是以 RabbitMQ 來作為訊息代理的中介軟體(實現將訊息路由到一個或多個目的地),所以要先安裝 RabbitMQ
RabbitMQ的安裝
RabbitMQ 是 AMQP(Advanced Message Queuing Protocol)協議的一個開源實現的產品
它是由以高效能、健壯、可伸縮性出名的 Erlang OTP 平臺實現的工業級的訊息佇列伺服器
所以在安裝 RabbitMQ 之前,要先安裝 Erlang,下面是它們的下載地址
Windows 下安裝成功後,RabbitMQ Server 會自動註冊為服務,並以預設配置啟動
也可以在開始選單,找到 RabbitMQ Server 目錄,點選 RabbitMQ Service - start 來啟動
RabbitMQ的管理
為了能在 Web 介面管理 RabbitMQ,我們還需要啟用它的管理外掛
D:\Develop\RabbitMQServer\rabbitmq_server-3.6.9\sbin>rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
amqp_client
cowlib
cowboy
rabbitmq_web_dispatch
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to [email protected] started 6 plugins.
D:\Develop\RabbitMQServer\rabbitmq_server-3.6.9\sbin>
登入進去之後,可以在上方的 Admin 導航選單中新建使用者,並分配許可權等等
示例程式碼
它是由四個模組組成的 Maven 工程,包含了一個註冊中心、一個配置中心、兩個讀取了配置中心屬性的服務提供方
由於改動不多,所以下面就只列出來各個改動點
註冊中心
無修改
配置中心
- 引入依賴項spring-cloud-starter-bus-amqp
- application.yml 中新增 spring.rabbitmq.* 的配置,如下所示
spring:
rabbitmq:
host: 127.0.0.1
port: 5672 # 注意埠是5672,不是15672
username: xuanyu
password: xuanyu
服務提供方
其改動部分與配置中心相同:都是引入依賴,新增 rabbitmq 配置,簡單粗暴一步到位(Spring Cloud Bus 自動化配置的功勞)
驗證
還是分別訪問兩個服務提供方暴露出來的介面
屬性熱載入時,需要呼叫訊息匯流排的 /bus/refresh
介面,共有兩種方式(都能使叢集中其它節點動態重新整理讀取到的屬性)
- 呼叫某個應用的介面:
curl -X POST http://127.0.0.1:2100/bus/refresh
- 呼叫訊息匯流排的介面:
curl -X POST http://127.0.0.1:4100/bus/refresh
但在需要遷移某個使用了的節點時,就不得不修改 Git 倉庫的 Webhooks
所以,為了使得各個微服務保持對等,故推薦第二種方式來重新整理屬性
另外,也可通過 destination 引數來指定重新整理範圍,舉例如下
curl -X POST http://127.0.0.1:4100/bus/refresh?destination=demo.cloud.config:2200
curl -X POST http://127.0.0.1:4100/bus/refresh?destination=demo.cloud.config:**