微服務之訊息匯流排SpringCloudBus
一、什麼是訊息匯流排?
在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息中心,並讓系統中所有微服務例項都連線上來。由於該中心中產生的訊息會被所有例項監聽和消費,所以稱它為訊息匯流排。
在總線上的各個例項,都可以方便地廣播─些需要讓其他連線在該匯流排的例項都知道的訊息,其原理是ConfigClient例項都監聽MQ中同一個Topic(預設是springCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知。
Spring Cloud Bus是用來將分散式系統的節點與輕量級訊息系統連結起來的框架,目前支援RabbitMQ和Kafka。RabbitMQ是一個實現了AMQP(Advanced Message Queuing Protocol)高階訊息佇列協議的訊息佇列服務,是一種訊息中介軟體,常被當作服務匯流排來使用。Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,也是訊息中介軟體的一種。
Spring Cloud Bus能管理和傳播分散式系統間的訊息,就像一個分散式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通訊通道。例如基於RabbitMQ實現配置中心配置資訊自動更新的架構模式如下:
二、RabbitMQ使用
1、RabbitMQ環境配置:
a.安裝Erlang:因為RabbitMQ服務端程式碼是使用併發式語言Erlang編寫的,所以需要Erlang環境,選擇適合自己電腦的版本安裝,下載地址http://erlang.org/download/,安裝完成後配置系統環境變數(變數名ERLANG_HOME,變數值為安裝路徑)、配置path變數(新增環境變數%ERLANG_HOME%\bin)。配置完成後啟動cmd輸入erl如果能看到版本號即為安裝成功。
b.安裝RabbbitMQ:下載合適電腦的版本安裝,下載地址https://www.rabbitmq.com/download.html,安裝完成後安裝RabbitMQ-Plugins外掛(cmd命令切換到安裝目錄的sbin路徑下,輸入rabbitmq-plugins enable rabbitmq_management即可完成安裝),最後開啟cmd進入sbin目錄輸入rabbitmqctlstatus,如果出現一下顯示,則表明安裝成功。接下來雙擊rabbitmq-server.bat,訪問http://localhost:15672即可進入web視覺化管理頁面(預設密碼賬號為guest)。
2、訊息廣播的兩種設計思想:
a.利用訊息匯流排觸發一個客戶端/bus/refresh,而重新整理所有客戶端的配置(不推薦)。
b.利用訊息匯流排觸發一個服務端ConfigServer的/bus/refresh端點,而重新整理所有客戶端的配置(推薦)。
3、微服務模組新增訊息匯流排支援:配置中心和客戶端都接入訊息匯流排,選擇第二種推薦的設計思想,實現廣播通知,步驟如下
a.服務模組中引入SpringCloudBus工具包
< !--新增訊息匯流排RabbitNQ支援--> <dependency> <groupid>org.springframework.cloud</ groupid> <artifactId>spring-cloud-starter-bus-amqp</artifactid>
</dependency>
b.修改配置yml配置檔案,增加如下配置(配置中心需要暴露bus重新整理配置的端點,客戶端則不需要)
#rabbitmq相關配置 rabbitmq: host: localhost #RabbitMQ伺服器地址 port: 5672 #RabbitMQ伺服器埠 sername: guest #RabbitMQ服務賬號 password: guest #RabbitMQ服務密碼 #rabbitmq相關配置-暴露bus重新整理配置的端點 management: endpoints:#暴露bus重新整理配置的端點 web; exposure: include: "bus-refresh'
完成以上配置之後,啟動所有微服務模組,post請求 http://localhost:3344/actuator/bus-refresh 配置中心端點,即可實現訊息廣播通知其他所有微服務,其他微服務進行配置檔案更新。如果只想通知config-client:3355微服務,就不能使用前面那個全域性廣播方式,只需要post 請求http://localhost:3344/actuator/bus-refresh/config-client:3355即可(微服務名稱+埠號)。