【SpringCloud】SpringCloud Bus訊息匯流排
SpringCloud Bus訊息匯流排
概述
上一講解的加深和擴充,一言以蔽之
- 分散式自動重新整理配置功能
- Spring Cloud Bus配合Spring Cloud Config使用可以實現配置的動態重新整理
是什麼
Spring Cloud Bus配合Spring Cloud Config使可以實現配置的動態重新整理。
Spring Cloud Bus是用來將分散式系統的節點與輕量級訊息系統連結起來的框架,它整合了Java的事件處理機制和訊息中介軟體的功能。
Spring Clud Bus目前支援RabbitMQ和Kafka.
能幹嘛
Spring Cloud Bus能管理和傳播分散式系統間的訊息,就像一個分散式執行器, 可於播狀態更改、事件推送等,也可以當作微服務間的通訊通道。
為什麼被稱為匯流排
什麼是匯流排
在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題, 並讓系統中所有微服務例項都連線上來。由於該主題中產生的訊息會被所有例項監聽和消費,所以稱它為訊息匯流排。在總線上的各個例項,都可以方便地廣播-些需要讓其他連線在該主題上的例項都知道的訊息。
基本原理
ConfigClient例項都監聽MQ中同-個topic(預設是springCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置。
https://www. bilili.com/video/av55976700?from=search&seid= 15010075915728605208
RabbitMQ環境配置
安裝Elang,下載地址
https://www.erlang.org/downloads
安裝RabbitMQ,下載地址
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3.exe
進入RabbitMQ安裝目錄下的sbin目錄
輸入以下命令啟動管理功能
- rabbitmq-plugins enable rabbitmq_management
- 視覺化外掛
訪問地址看是否成功安裝
http://localhost:15672
輸入賬號並登入 guest guest
SpringCloud Bus動態重新整理全域性廣播
必須具備良好的RabbitMQ環境
演示廣播效果,增加複雜度,再以3355位模板製作一個3366
只是換個埠,其他與3355一致
設計思想
1.利用訊息匯流排觸發一個客戶端/bus/refresh,從而重新整理所有客戶端配置
2.利用訊息匯流排觸發一個服務端ConfigServer的/bus/refresh端點,從而重新整理所有客戶端配置
圖二的架構顯然更加合適,圖一不合適原因如下
- 打破了微服務的職責單一性,因為微服務本身是業務模組,它本不應該承擔配置重新整理的職責
- 破壞了微服務各節點的對等性
- 有一定的侷限性,例如,微服務在遷移時,它的網路地址常常會發生變化,此時如果想要做到自動重新整理那就會增加更多的修改
給cloud-config-center-3344配置中心服務端新增訊息匯流排支援
POM
<!-- 新增訊息匯流排RabbitMQ支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
#uri: [email protected]:EiletXie/config-repo.git #Github上的git倉庫名字
uri: https://github.com/EiletXie/config-repo.git
##搜尋目錄.這個目錄指的是github上的目錄
search-paths:
- config-repo
##讀取分支
label: master
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
#rabbitmq相關設定 ,暴露 bus重新整理配置的端點
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
給cloud-config-center-3355配置中心服務端新增訊息匯流排支援
POM
<!-- 新增訊息匯流排RabbitMQ支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客戶端配置
config:
label: master #分支名稱
name: config #配置檔名稱
profile: dev #讀取字尾名稱 上訴3個綜合就是 master分支上 config-dev.yml
uri: http://localhost:3344
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
#暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
給cloud-config-center-3366配置中心服務端新增訊息匯流排支援
POM
<!-- 新增訊息匯流排RabbitMQ支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML
server:
port: 3366
spring:
application:
name: config-client
cloud:
#Config客戶端配置
config:
label: master #分支名稱
name: config #配置檔名稱
profile: dev #讀取字尾名稱 上訴3個綜合就是 master分支上 config-dev.yml
uri: http://localhost:3344
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
#暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
測試
運維工程師
修改Github上配置檔案增加版本號
傳送Post請求
- curl -X POST "http://localhost:3344/actuator/bus-refresh"
- 一次傳送,處處生效
配置中心
http://lconfig-3344.com:3344/config-dev.yml
客戶端
- http://localhost:3355/configInfo
- http://localhost:3366/configInfo
- 獲取配置資訊,發現都已經重新整理了
一次修改,廣播通知,處處生效
SpringCloud Bus動態重新整理定點通知
不想全部通知,只想定點通知
- 只通知3355
- 不通知3366
簡單一句話
- 指定某一例項生效而不是全部
- 公式:http://localhost:3344/actutor/bus-refresh/{destination}
- /bus/refresh請求不再發送到具體的服務實力上,而是發給config server通過destination引數指定需要更新配置的服務或例項
案例
我們這裡以重新整理3355埠上的config-client為例
- 只通知3355
- 不通知3366
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"