前言
歡迎來到菜鳥SpringCloud實戰入門系列(SpringCloudForNoob),該系列通過層層遞進的實戰視角,來一步步學習和理解SpringCloud。
本系列適合有一定Java以及SpringBoot基礎的同學閱讀。
每篇文章末尾都附有本文對應的Github原始碼,方便同學除錯。
Github倉庫地址:
菜鳥SpringCloud實戰入門系列
你可以通過以下兩種途徑檢視菜鳥SpringCloud實戰入門系列:
- 關注我的公眾號:Rude3Knife 點選公眾號下方:技術推文——SpringCloud
- 菜鳥SpringCloud實戰入門專欄導航頁(CSDN)
前文回顧:
- [菜鳥SpringCloud實戰入門]第一章:構建多模組的Maven專案+建立註冊中心Eureka子模組
- [菜鳥SpringCloud實戰入門]第二章:建立服務提供者並在Eureka進行註冊
- [菜鳥SpringCloud實戰入門]第三章:將Eureka改造為高可用叢集
- [菜鳥SpringCloud實戰入門]第四章:遠端呼叫服務實戰
- [菜鳥SpringCloud實戰入門]第五章:熔斷器Hystrix的使用 + 視覺化監控Hystrix Dashboard和Turbine
- [菜鳥SpringCloud實戰入門]第六章:配置中心Spring Cloud Config初體驗
- [菜鳥SpringCloud實戰入門]第七章:配置中心客戶端主動重新整理機制 + 配置中心服務化和高可用改造
- ...更多文章請檢視上方:菜鳥SpringCloud入門實戰專欄導航頁
實戰版本
- SpringBoot:2.0.3.RELEASE
- SpringCloud:Finchley.RELEASE
-----正文開始-----
通過訊息匯流排Spring Cloud Bus更新客戶端配置檔案(使用Kafka)
前文提到,如果需要客戶端獲取到最新的配置資訊需要執行refresh,我們可以利用webhook的機制每次提交程式碼傳送請求來重新整理客戶端,當客戶端越來越多的時候,需要每個客戶端都執行一遍,這種方案就不太適合了。使用Spring Cloud Bus可以完美解決這一問題。
Spring bus的一個核心思想是通過分散式的啟動器對spring boot應用進行擴充套件,也可以用來建立一個多個應用之間的通訊頻道。目前唯一實現的方式是用AMQP訊息代理作為通道,同樣特性的設定(有些取決於通道的設定)在更多通道的文件中。其實本質是利用了MQ的廣播機制在分散式的系統中傳播訊息,目前常用的有Kafka和RabbitMQ。
以下是本文即將實現的架構:
更新客戶端配置檔案整個流程是:
- 提交程式碼觸發post請求給bus/refresh
- server端接收到請求併傳送給Spring Cloud Bus
- Spring Cloud bus接到訊息並通知給其它客戶端
- 其它客戶端接收到通知,請求Server端獲取最新配置
- 全部客戶端均獲取到最新的配置
安裝kafka
請參考我的文章:
與config-server模組進行整合
config-server模組在上一章有介紹
新增依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
複製程式碼
修改配置檔案,新增kafka配置:
springboot2中只需要這一句,不足要zk-node等設定啦。
# kafka
stream:
kafka:
binder:
brokers: localhost:9092
bus:
trace:
enabled: true
複製程式碼
完整配置檔案如下:
server:
port: 8769
spring:
application:
name: spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://xxxxxxxxxxxx.git # 配置git倉庫的地址
search-paths: config-repo # git倉庫地址下的相對地址,可以配置多個,用,分割。
username: xxxxxxxx # git倉庫的賬號
password: xxxxxxx # git倉庫的密碼
# kafka
stream:
kafka:
binder:
brokers: localhost:9092
bus:
trace:
enabled: true
# 客戶端呼叫需要
management:
endpoints:
web:
exposure:
include: "*"
# 在服務中心註冊
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
複製程式碼
與config-client模組進行整合
服務端設定好了匯流排,客戶端當然也要和匯流排連線
依賴和配置檔案的修改,與config-server一模一樣,照著上面修改就可以了。
測試執行
分別執行eureka,config-server和config-client模組,這裡我們開啟兩個config-client模組,分別對應埠8771,8772.
啟動後的程式結構如下:
可以看到eureka裡註冊了服務端和兩個客戶端:
我們直接訪問config-server,檢視服務端現在的配置檔案:
http://localhost:8769/spring-cloud-config-dev.properties
檢視config-client的hello介面,得到配置檔案內容:接下來,將配置檔案修改一下,加點字元。
隨後push到遠端伺服器。
然後訪問 http://localhost:8769/spring-cloud-config-dev.properties :
發現已經服務端更新了。
這時候,我們需要做更新,傳送POST請求:
curl -X POST http://localhost:8769/actuator/bus-refresh
複製程式碼
這是springboot2的請求,和老的請求格式不同,可以從程式啟動時候的mapping日誌中看出。
這時候請求 :
更新成功!
你還可以通過trace來跟蹤匯流排事件:
一些場景下,我們可能希望知道Spring Cloud Bus事件傳播的細節。此時,我們可以跟蹤匯流排事件(RemoteApplicationEvent的子類都是匯流排事件)。
http://localhost:8769/actuator/httptrace
複製程式碼
本章程式碼
參考
www.ityouknow.com/springcloud…
-----正文結束-----
菜鳥SpringCloud實戰入門專欄全導航:通過以下兩種途徑檢視
- 關注我的公眾號:Rude3Knife 點選公眾號下方:技術推文——SpringCloud
- 菜鳥SpringCloud實戰專欄(CSDN)
關注我
我是蠻三刀把刀,後端開發。主要關注後端開發,資料安全,爬蟲等方向。
來微信和我聊聊:yangzd1102
個人公眾號:Rude3Knife
如果文章對你有幫助,不妨收藏起來並轉發給您的朋友們~