概述
解決什麼問題?
- 分布式自動重新整理配置功能
- 可以結合 SpringCloud Config 實作自動重新整理配置
是什麼?
- Bus 支援兩種消息代理 : RabbitMQ、Kafka
為什麼被稱作總線
- Spring Cloud Bus 配合過SpringCloud Config 可以實作配置的動态重新整理
- Spring Cloud Bus 是用來将分布式系統的節點與輕量級消息系統連結起來的架構,
它整合了Java的事件處理機制和消息中間中間件功能
-
什麼是總線
在微服務架構的系統中,通常會使用 輕量級的消息代理 來建構一個
, 炳然系統同中所有的微服務執行個體都連接配接上來,由于該主題中産生的共用的消息主題
,是以它成為消息會被所有執行個體監聽和消費
。在總線的各個執行個體,都可以友善地廣播一些需要讓其他連結在該主題上的執行個體都知道的消息。消息總線
-
基本原理
Config Clinet 執行個體會監聽MQ中同一個 Topic (預設是 springCloudBus ). 當一個服務刷星資料的時候,會把這個資訊放入到 Topic 彙總,這樣其他監聽同一個 topic 服務就能得到通知,然後更新自身的配置。
使用RabbitMQ搭建消息總線
- 安裝RabbitMQ
- 啟動: 在bin目錄下執行 rabbitmq-plugins enable rabbitmq_management
- 也可以通過可視化界面 進行啟動
SpringCloud Bus 動态重新整理全局廣播
廣播效果,需要準備2個接受服務
設計思想
1)利用消息總線觸發一個用戶端 /bus/refresh, 而重新整理所有用戶端的配置
2)利用消息總線觸發一個服務端 ConfigServer 的 bus/refresh 端點,而重新整理所有用戶端的配置
第二種方案更加合适,第一種方案不合适的原因:
- 打破了微服務的
,因為職責單一性
本身是業務子產品,它本不應該承擔配置重新整理的職責微服務
- 破壞了微服務
各個節點的對等性
- 有一定的
,例如, 在微服務遷移時,它的網絡位址常常會發生變化,如果此時時想自動重新整理,會增加更多的工作局限性
實作
一: 配置中心添加消息支援
- 添加依賴
<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: https://gitee.com/aqiang9/cloud2020-config.git
search-paths:
- cloud2020-config
# 讀取的分支
label: master
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: config-center
prefer-ip-address: true
management:
endpoints:
web:
exposure: #
include: "bus-refresh"
二: :server端添加消息支援
- pom.xml (同配置中心)
- yml配置檔案(添加)
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
(拷貝一個3355 為 3366 , 兩個配置基本相同)
三: 測試
- 修改 git總的配置檔案
- 重新整理 配置中心: curl -X POST ”http://127.0.0.1:3344/actuator/bus-refresh“
-
一次發送,處處生效
SpringCloud Bus 動态屬性定點通知
簡單了解
- 公式:
http://127.0.0.1:配置中心端口/actuator/bus-refresh/{destination}
-
請求不在發送到具體的服務執行個體上,而是發送給/bus/refresh
通過config server
參數指定需要destination
更新配置的服務或執行個體
- destination 為 :
:spring.application.name
總結:server.port