1. 程式人生 > >Spring-Cloud-Config訊息匯流排和高可用

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註冊中心和訊息匯流排本身也需要高可用性,這裡就不過多介紹了。