ConfigClient(微服務)從ConfigServer端獲取本身對應的配置文件,可是目前的問題是:當遠程git倉庫配置文件發生改變時,每次都是須要重啓ConfigCient(微服務),若是有上百上千個微服務呢?我想咱們不會一個個去重啓每一個微服務,也就是說如何讓ConfigServer端通知到ConfigClient端?即ConfigClient端如何感知到配置發生更新?html
SpringCloud Bus會向外提供一個http接口,即下圖中的/bus/refresh。咱們將這個接口配置到git的webhook上,當git上的內容發生改變時,就會自動調用/bus/refresh接口。Bus就會通知ConfigServer,configserver會發布更新消息到消息總線的消息隊列,其餘服務訂閱到該消息就會信息刷新,從而實現整個微服務進行自動刷新。git
SpringCloud Bus官網地址:https://www.springcloud.cc/spring-cloud-bus.htmlgithub
①提交配置出發post請求調用客戶端A的/bus/refresh接口web
②客戶端A收到請求從Server端更新配置而且發送給Spring Cloud Bus消息總線spring
③Spring Cloud Bus接收消息並通知給其餘連線在總線上的客戶端,全部總線上的客戶端均能接收到消息。bootstrap
④其餘客戶端接收到消息,請求Server端獲取最新配置瀏覽器
⑤所有客戶端均獲取到最新的配置服務器
以上存在問題:併發
①打破微服務的單一原則。微服務自己是業務模塊,本不該該承擔配置刷新的職責app
②WebHook的配置也隨着承擔刷新配置的微服務節點發生變化。
①提交配置觸發post請求給server端的/bus/refresh接口
②server端接收到請求併發送給SpringCloud Bus總線
③Sping Cloud Bus接收到消息並通知給其餘鏈接的總線的客戶端
④其餘客戶端接收到通知,請求Server端獲取最新配置
⑤所有客戶端獲取到最新的配置
基於方式二的實現,分爲Config Server和Config Client配置
<!--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
ConfigServer服務端配置完成!
<!--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
至此,Config Client端配置完成!
前邊:ConfigServer和ConfigClient配置完成,要實現自動刷新須要調用/bus/refresh接口經過ConfigServer
修改完成之後,查看ConfigServer服務端的控制檯日誌打印以下:
至此,Config配置自動刷新完成!
本項目地址:https://github.com/Simple-Coder/microservice-demo-study