說(shuō)明
之前我們知道了如何使用spring cloud config 進(jìn)行統(tǒng)一配置,但是,當(dāng)配置發(fā)生了變化的時(shí)候,需要服務(wù)自行去刷新才能更新。在實(shí)際的使用場(chǎng)景中這是一個(gè)可怕的工作量,并且容易出錯(cuò)誤。這里有一個(gè)通用的解決方案,使用spring cloud bus結(jié)合消息中間件,通過(guò)消息通知的方式進(jìn)行配置的刷新。

整體架構(gòu)圖
當(dāng)有配置信息發(fā)生變化的時(shí)候,會(huì)有如下的方式完成配置的刷新和通知
- 向配置中心發(fā)送刷新請(qǐng)求 POST /bus/refresh
- 配置中心向消息總線(xiàn)發(fā)送消息
- 所有的服務(wù)接收消息總線(xiàn)的消息
- 服務(wù)向配置中心獲取最新的配置信息從而完成配置的刷新工作
使用和驗(yàn)證步驟
- 使用eureka注冊(cè)服務(wù)
- 修改配置中心應(yīng)用,提供spring cloud bus的支持:演示項(xiàng)目源碼
- 修改各個(gè)服務(wù),提供spring cloud bus的支持:演示項(xiàng)目源碼
- 修改配置文件,并提交到git服務(wù)器
- 向配置中心提交 POST /bus/refresh
- 查看各個(gè)服務(wù)的配置信息,正常情況下應(yīng)該配置生效
配置中心改造
- 修改pom.xml增加依賴(lài),這里使用RabbitMq作為消息中間件,遵循amqp標(biāo)準(zhǔn)
<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>
- 配置文件中增加RabbitMq的配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
#spring.rabbitmq.username=linxm
#spring.rabbitmq.password=111111
# 打開(kāi)安全控制,通過(guò)/refresh刷新數(shù)據(jù)
management.security.enabled=false
endpoints.enabled=false
endpoints.refresh.enabled=true
- 正確啟動(dòng)之后,可以發(fā)送 POST /bus/refresh 進(jìn)行驗(yàn)證
服務(wù)的改造
與配置中心的改造方法完全一樣!
然后就可以啟動(dòng)服務(wù)進(jìn)行驗(yàn)證了!
注意:
我們可以指定刷新范圍:通過(guò)使用destination參數(shù)
- 刷新具體服務(wù)
/bus/refresh?destination=mybusservice1:1811
- 刷新某種服務(wù)
/bus/refresh?destination=mybusservice1:**
使用kafka做消息中間件
邏輯上與RabbitMq的方法沒(méi)有區(qū)別
- 增加pom.xml依賴(lài)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
- 修改配置文件
# Kafka的服務(wù)端列表,默認(rèn)值localhost
spring.cloud.stream.kafka.binder.brokers=master,backup
# Kafka服務(wù)端的默認(rèn)端口,當(dāng)brokers屬性中沒(méi)有配置端口信息時(shí),就會(huì)使用這個(gè)默認(rèn)端口
spring.cloud.stream.kafka.binder.defaultBrokerPort=9092
# Kafka服務(wù)端連接的ZooKeeper節(jié)點(diǎn)列表
spring.cloud.stream.kafka.binder.zkNodes=localhost
# ZooKeeper節(jié)點(diǎn)的默認(rèn)端口,當(dāng)zkNodes屬性中沒(méi)有配置端口信息時(shí),就會(huì)使用這個(gè)默認(rèn)端口
spring.cloud.stream.kafka.binder.defaultZkPort=2181