1. 程式人生 > >SpringCloud系列第09節之訊息匯流排Bus

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 工程,包含了一個註冊中心、一個配置中心、兩個讀取了配置中心屬性的服務提供方

由於改動不多,所以下面就只列出來各個改動點

註冊中心

無修改

配置中心

  1. 引入依賴項spring-cloud-starter-bus-amqp
  2. 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 介面,共有兩種方式(都能使叢集中其它節點動態重新整理讀取到的屬性)

  1. 呼叫某個應用的介面:curl -X POST http://127.0.0.1:2100/bus/refresh
  2. 呼叫訊息匯流排的介面: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:**