Spring-Cloud-Config訊息匯流排和高可用
前言
上文中簡單的介紹了Spring-Cloud-Config如何使用,如何手動更新配置檔案,並且在文末提出了幾個疑問,其中包括多個Client節點如何更新,Server端如何保證高可用性等;本文將重點介紹通過使用Spring Cloud Bus來批量更新客戶端,以及Server如何保證高可用;
Spring Cloud Bus訊息匯流排
Spring Cloud Bus使用輕量級訊息代理連結分散式系統的節點,可以用於廣播狀態改變(例如,配置改變)或其他管理指令;目前唯一實現的方式是用AMQP訊息代理作為通道,其實本質是利用了MQ的廣播機制在分散式的系統中傳播訊息,目前常用的有Kafka和RabbitMQ;下面重點使用kafka來實現多客戶端重新整理配置檔案;
1.總體更新流程
大致流程圖如下所示:
2.kafka安裝部署
kafka部署依賴Zookeeper,使用的版本分別是:kafka_2.11-1.0.1和zookeeper-3.4.3,具體如何安裝部署可參考:Kafka快速開始文章
3.server端改造
3.1新增新的依賴
3.2application.properties新增配置
4.client改造
4.1新增新的依賴
4.2application.properties新增配置
5.啟動測試
5.1啟動Server端
觀察啟動日誌,可以發現/actuator/bus-refresh對映
往下可以有如下這行日誌:
Server端連線kafka建立了一個名稱為springCloudBus的Topic,用來作為配置檔案更新的訊息通知;可以去kafka上檢視:
5.2啟動Client
分別指定啟動埠為8881和8882,可以看到和Server端類似的日誌,訂閱了名為springCloudBus的Topic,這樣Server端傳送訊息給kafka,kafka通知client更新資料;
5.3測試
分別訪問http://localhost:8881/hello和http://localhost:8882/hello,結果如下:
更新git中的配置檔案為:
POST方式請求Server端,用來更新配置檔案
分別訪問http://localhost:8881/hello和http://localhost:8882/hello,結果如下:
2個客戶端都獲取到了最新的資料,表示更新成功;
在上圖中我們發現Server端承擔了太多的任務,而上圖中Server端是一個單點,這樣就不能保證系統高可用,下面看一下如何分散式部署Server端;
Server端保證高可用
Server端通過註冊中心Eureka來保證高可用,下面看一下具體流程:
1.Eureka註冊中心
1.1Eureka-Server依賴
1.2啟動配置檔案
eureka.client.register-with-eureka:是否將自己註冊到Eureka Server,預設為true
eureka.client.fetch-registry:是否從Eureka Server獲取註冊資訊,預設為true
eureka.client.serviceUrl.defaultZone:Eureka Server互動地址
1.3準備啟動類
2.改造Server端(服務提供方)
2.1Eureka-Client依賴
2.2啟動配置檔案
指定註冊中心地址,也就是Eureka-Server配置的地址
2.3啟動類新增@EnableDiscoveryClient註釋,實現服務註冊和發現
3.改造Client端(服務消耗方)
3.1Eureka-Client依賴
3.2啟動配置檔案
註釋掉具體的Server端地址
spring.cloud.config.discovery.enabled:開啟服務發現支援
spring.cloud.config.discovery.serviceId:服務提供端的名稱
eureka.client.serviceUrl.defaultZone:配置中心的地址
4.測試
首先啟動註冊中心eurekaServer,埠為8880;然後啟動多個config-server端,埠分別為:8887,8888;最後啟動多個config-client端,埠分別是:8883,8884;
可以檢視註冊中心,註冊的服務:
分別訪問http://localhost:8883/hello和http://localhost:8884/hello,結果如下:
更新git中的配置檔案為:
POST方式請求Server端,用來更新配置檔案
這裡只是選擇了其中一個server端去更新,任意一個都可以;
分別訪問http://localhost:8883/hello和http://localhost:8884/hello,結果如下:
2個客戶端都獲取到了最新的資料,表示更新成功;
將8888埠的Server端停掉,再次更新配置檔案為
POST方式請求Server端,用來更新配置檔案
分別訪問http://localhost:8883/hello和http://localhost:8884/hello,結果如下:
2個客戶端都獲取到了最新的資料,表示更新成功;
總結
通過訊息匯流排的方式解決了多個Client更新的問題,以及通過eureka來保證Server的高可用性;當然eureka註冊中心和訊息匯流排本身也需要高可用性,這裡就不過多介紹了。