springcloud:config搭配bus使用
Spring Cloud Bus簡介
Spring Cloud Bus能管理和傳播分散式系統間的訊息,就像一個分散式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通訊通道。
什麼是匯流排
在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題,並讓系統中所有微服務例項都連線上來。由於該主題中產生的訊息會被所有例項監聽和消費,所以稱它為訊息匯流排。在總線上的各個例項,都可以方便地廣播一些需要讓其他連線在該主題上的例項都知道的訊息。
基本原理
ConfigClient例項都監聽MQ中同一個topic(預設是springCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置。
Spring Cloud Bus支援的訊息中介軟體
目前Spring Cloud Bus只支援RabbitMQ 和 Kafka
Spring Cloud Bus搭配Spring Cloud Config使用
本案例採用rabbitmq,環境的安裝請自行準備。
環境搭建
- 首先建立好一個configServer,兩個相同服務configClient的微服務例項。
- 採用給configServer傳送重新整理通知,達到通知全體訂閱的configClient,架構圖如下:
- configServer和configClient都得有rabbitmq的支援和配置才行。因為從mq的角度上看,其實就是生產者和消費者的關係。
configServer新增依賴:
<!--新增訊息匯流排RabbitMQ支援--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
configServer的YML:
server:
port: 3344
spring:
application:
name: cloud-config-center #註冊進Eureka伺服器的微服務名
cloud:
config:
server:
git:
uri: https://gitee.com/HXueWen/springcloud-config.git #GitHub上面的git倉庫名字
####搜尋目錄
search-paths:
- springcloud-config
####讀取分支
label: master
#rabbitmq相關配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
##rabbitmq相關配置,暴露bus重新整理配置的端點
management:
endpoints: #暴露bus重新整理配置的端點
web:
exposure:
include: 'bus-refresh'
configClient新增依賴:
<!--新增訊息匯流排RabbitMQ支援-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
configClient的YML:
spring:
application:
name: config-client
cloud:
#Config客戶端配置
config:
label: master #分支名稱
name: application #配置檔名稱
profile: dev #讀取字尾名稱 上述3個綜合:master分支上config-dev.yml的配置檔案被讀取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址k
#rabbitmq相關配置 15672是Web管理介面的埠;5672是MQ訪問的埠
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#eureka配置
eureka:
client:
#表示是否將自己註冊進EurekaServer預設為true。
register-with-eureka: true
#是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 叢集版
management:
endpoints:
web:
exposure:
include: "*"
測試
啟動configServer和兩個configClient,然後修改github上面的配置資訊,給configServer傳送post請求,如下:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
傳送後訪問兩個configClient:http://localhost:3355/configInfo和http://localhost:3366/configInfo,發現都發生了改變。只需要傳送一次請求,實現全體訂閱服務的配置更新。
Spring Cloud Bus搭配Spring Cloud Config實現定點通知
可能會有這樣的一個需求:就是configServer發生更新,按理來說他下面的configClient也應該都發生更新。不過現在只想讓其中一部分configClient讀取最新配置,另一些保持現狀,這個該如何實現呢?
其實很簡單,只需要在原有post請求地址上多加一個引數就行,如下:
公式:http://localhost:配置中心的埠號/actuator/bus-refresh/{destination}
這裡的{destination}一般是:微服務名:埠號
比如說現在讓3355更新,3366不更新,則傳送:
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"