一、概述
configclient(微服務)從configserver端獲取自己對應的配置檔案,但是目前的問題是:當遠端git倉庫配置檔案發生改變時,每次都是需要重啟configcient(微服務),如果有上百上千個微服務呢?我想我們不會乙個個去重啟每個微服務,也就是說如何讓configserver端通知到configclient端?即configclient端如何感知到配置發生更新?
springcloud bus會向外提供乙個http介面,即下圖中的/bus/refresh。我們將這個介面配置到git的webhook上,當git上的內容發生改變時,就會自動呼叫/bus/refresh介面。bus就會通知configserver,configserver會發布更新訊息到訊息匯流排的訊息佇列,其他服務訂閱到該訊息就會資訊重新整理,從而實現整個微服務進行自動重新整理。
二、原理
①提交配置出發post請求呼叫客戶端a的/bus/refresh介面
②客戶端a收到請求從server端更新配置並且傳送給spring cloud bus訊息匯流排
③spring cloud bus接收訊息並通知給其他連線在匯流排上的客戶端,所有匯流排上的客戶端均能接收到訊息。
④其他客戶端接收到訊息,請求server端獲取最新配置
⑤全部客戶端均獲取到最新的配置
三、實踐
繼續使用上一遍**,新增eureka-server module(同教程一),config-client和config-server新增spring-cloud-starter-bus-amqp依賴,
訊息中介軟體使用rabbitmq,安裝方法見
config-client:
在配置檔案bootstarp.properties中加上rabbitmq的配置,包括rabbitmq的位址、埠,使用者名稱、密碼,**如下:
spring.rabbitmq.host=localhost如果rabbitmq有使用者名稱密碼,輸入即可。spring.rabbitmq.port=5672
# spring.rabbitmq.username=
# spring.rabbitmq.password=
依次啟動eureka-server、confg-cserver,啟動兩個config-client,埠為:8881、8882。
訪問http://localhost:8881/hello 或者http://localhost:8882/hello 瀏覽器顯示:
1 foo version 25這時我們去git將foo的值改為「foo version 26」,即改變配置檔案foo的值。如果是傳統的做法,需要重啟服務,才能達到配置檔案的更新。此時,我們只需要傳送post請求(postman即可):http://localhost:8881/bus/refresh,你會發現config-client會重新讀取配置檔案
這時我們再訪問http://localhost:8881/hello或者http://localhost:8882/hello 瀏覽器顯示:
1 foo version 26另外,/bus/refresh介面可以指定服務,即使用」destination」引數,比如 「/bus/refresh?destination=customers:**」 即重新整理服務名為customers的所有服務,不管ip。
四、參考資料
spring_cloud_bus
五、原始碼
加入qq群:spring全家桶技術交流①群196165973,免費獲取原始碼。
springcloud高階教程
springcloud為開發人員提供了快速構建分布式系統中一些常見模式的工具 例如配置管理,服務發現,斷路器,智慧型路由,微 控制匯流排 分布式系統的協調導致了樣板模式,使用spring cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任何分布式環境中執行良好,包括開發人員自己...
SpringCloud系列八 Hystrix 簡介
1 分布式系統面臨的問題 複雜分布式體系結構中的應用程式有數十個依賴關係,每個依賴關係在某些時候將不可避免地失敗。服務雪崩 多個微服務之間呼叫的時候,假設微服務a呼叫微服務b和微服務c,微服務b和微服務c又呼叫其它的微服務,這就是所謂的 扇出 如果扇出的鏈路上某個微服務的呼叫響應時間過長或者不可用,...
springcloud中config和bus的使用
乙個配置中心提供的核心功能 提供服務端和客戶端支援 集中管理各環境的配置檔案 配置檔案修改之後,可以快速的生效 可以進行版本管理 支援大的併發查詢 支援各種語言 spring cloud config可以完美的支援以上所有的需求。spring cloud config專案是乙個解決分布式系統的配置管...