一、概述
ConfigClient(微服務)從ConfigServer端獲取自己對應的配置文件,但是目前的問題是:當遠程git倉庫配置文件發生改變時,每次都是需要重啟ConfigCient(微服務),如果有上百上千個微服務呢?我想我們不會一個個去重啟每個微服務,也就是說如何讓ConfigServer端通知到ConfigClient端?即ConfigClient端如何感知到配置發生更新?
SpringCloud Bus會向外提供一個http接口,即下圖中的/bus/refresh。我們將這個接口配置到git的webhook上,當git上的內容發生改變時,就會自動調用/bus/refresh接口。Bus就會通知ConfigServer,configserver會發布更新消息到消息總線的消息隊列,其他服務訂閱到該消息就會信息刷新,從而實現整個微服務進行自動刷新。
SpringCloud Bus官網地址:https://www.springcloud.cc/spring-cloud-bus.html
二、實現方式
(1)方式一:某個微服務承擔配置刷新的職責
①提交配置出發post請求調用客戶端A的/bus/refresh接口
②客戶端A收到請求從Server端更新配置並且發送給Spring Cloud Bus消息總線
③Spring Cloud Bus接收消息並通知給其他連線在總線上的客戶端,所有總線上的客戶端均能接收到消息。
④其他客戶端接收到消息,請求Server端獲取最新配置
⑤全部客戶端均獲取到最新的配置
以上存在問題:
①打破微服務的單一原則。微服務本身是業務模塊,本不應該承擔配置刷新的職責
②WebHook的配置也隨着承擔刷新配置的微服務節點發生變化。
(2)方式二:配置中心Server端承擔起配置刷新的職責,原理圖如下:
①提交配置觸發post請求給server端的/bus/refresh接口
②server端接收到請求並發送給SpringCloud Bus總線
③Sping Cloud Bus接收到消息並通知給其他連接的總線的客戶端
④其他客戶端接收到通知,請求Server端獲取最新配置
⑤全部客戶端獲取到最新的配置
三、實現步驟
基於方式二的實現,分為Config Server和Config Client配置
0.RabbitMQ的安裝
1.ConfigServer服務端配置
1.1添加pom、application.yml配置

<!--config server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- springcloud-bus依賴實現配置自動更新,rabbitmq --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>

server:
port: 3344
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
uri: https://github.com/Simple-Coder/microservice-config.git #github上的倉庫地址
search-paths: /**
username: ******** #這里配置用戶名
password: ******** #這里配置密碼
label: master
rabbitmq:
host: 39.98.190.54 #公網地址
port: 5672
username: guest
password: guest
#SpringCloud暴露接口,暴露/bus/refresh接口
management:
security:
enabled: false
#開啟基本的權限,默認為true
security:
basic:
enabled: false
1.2 啟動類添加@EnableConfigServer
ConfigServer服務端配置完成!
2.ConfigClient服務端配置
2.1添加pom依賴、bootstrap.yml配置

<!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--amqp--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

spring:
cloud:
config:
name: microservice-config-client #需要從github上讀取的資源名稱,注意沒有yml名稱
profile: test #本次訪問的配置項
label: master
uri: http://39.98.190.54:3344 #本服務啟動后先去找3344服務,通過SpringCloudConfig獲取github的服務地址
rabbitmq:
host: 39.98.190.54
port: 5672
username: guest
password: guest
security:
basic:
enabled: false
2.2添加注解: @RefreshScope添加在需要刷新的配置文件上
至此,Config Client端配置完成!
3.WebHook配置
前邊:ConfigServer和ConfigClient配置完成,要實現自動刷新需要調用/bus/refresh接口通過ConfigServer
3.1方式一:手動調用(post請求):http://config3344.com:3344/bus/refresh
3.2方式二:配置git的webhook ,當git端配置發生改變,自動調用/bus-refresh接口
四、測試
(1)啟動ConfigServer(含有公網IP的服務器,我這里買的阿里雲服務器)
(2)啟動ConfigClient:本地代碼工程(microservice-config-client3355)
(3)瀏覽器訪問:http://localhost:5002/config
(4)修改配置文件:microservice-config-client.yml
修改完成以后,查看ConfigServer服務端的控制台日志打印如下:
(5)刷新:http://localhost:5002/config
至此,Config配置自動刷新完成!
本項目地址:https://github.com/Simple-Coder/microservice-demo-study
參考鏈接:https://blog.csdn.net/wtdm_160604/article/details/83720391