前言
上文中簡單的介紹了Spring-Cloud-Config如何使用翁锡,如何手動更新配置文件馆衔,并且在文末提出了幾個疑問怨绣,其中包括多個Client節(jié)點如何更新篮撑,Server端如何保證高可用性等赢笨;本文將重點介紹通過使用Spring Cloud Bus來批量更新客戶端质欲,以及Server如何保證高可用嘶伟;
Spring Cloud Bus消息總線
Spring Cloud Bus使用輕量級消息代理鏈接分布式系統(tǒng)的節(jié)點,可以用于廣播狀態(tài)改變(例如绊袋,配置改變)或其他管理指令癌别;目前唯一實現(xiàn)的方式是用AMQP消息代理作為通道展姐,其實本質(zhì)是利用了MQ的廣播機制在分布式的系統(tǒng)中傳播消息圾笨,目前常用的有Kafka和RabbitMQ;下面重點使用kafka來實現(xiàn)多客戶端刷新配置文件土铺;
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端
觀察啟動日志窟赏,可以發(fā)現(xiàn)/actuator/bus-refresh映射
往下可以有如下這行日志:
Server端連接kafka創(chuàng)建了一個名稱為springCloudBus的Topic棍掐,用來作為配置文件更新的消息通知作煌;可以去kafka上查看:
5.2啟動Client
分別指定啟動端口為8881和8882粟誓,可以看到和Server端類似的日志鹰服,訂閱了名為springCloudBus的Topic悲酷,這樣Server端發(fā)送消息給kafka,kafka通知client更新數(shù)據(jù)逗柴;
5.3測試
分別訪問http://localhost:8881/hello和http://localhost:8882/hello戏溺,結(jié)果如下:
更新git中的配置文件為:
POST方式請求Server端知染,用來更新配置文件
分別訪問http://localhost:8881/hello和http://localhost:8882/hello,結(jié)果如下:
2個客戶端都獲取到了最新的數(shù)據(jù)涧狮,表示更新成功者冤;
在上圖中我們發(fā)現(xiàn)Server端承擔(dān)了太多的任務(wù),而上圖中Server端是一個單點困后,這樣就不能保證系統(tǒng)高可用吗跋,下面看一下如何分布式部署Server端救鲤;
Server端保證高可用
Server端通過注冊中心Eureka來保證高可用斥扛,下面看一下具體流程:
1.Eureka注冊中心
1.1Eureka-Server依賴
1.2啟動配置文件
eureka.client.register-with-eureka:是否將自己注冊到Eureka Server,默認(rèn)為true
eureka.client.fetch-registry:是否從Eureka Server獲取注冊信息阶女,默認(rèn)為true
eureka.client.serviceUrl.defaultZone:Eureka Server交互地址
1.3準(zhǔn)備啟動類
2.改造Server端(服務(wù)提供方)
2.1Eureka-Client依賴
2.2啟動配置文件
指定注冊中心地址,也就是Eureka-Server配置的地址
2.3啟動類添加@EnableDiscoveryClient注釋,實現(xiàn)服務(wù)注冊和發(fā)現(xiàn)
3.改造Client端(服務(wù)消耗方)
3.1Eureka-Client依賴
3.2啟動配置文件
注釋掉具體的Server端地址
spring.cloud.config.discovery.enabled:開啟服務(wù)發(fā)現(xiàn)支持
spring.cloud.config.discovery.serviceId:服務(wù)提供端的名稱
eureka.client.serviceUrl.defaultZone:配置中心的地址
4.測試
首先啟動注冊中心eurekaServer荆虱,端口為8880诉位;然后啟動多個config-server端苍糠,端口分別為:8887蚊锹,8888;最后啟動多個config-client端丢烘,端口分別是:8883,8884赢乓;
可以查看注冊中心骏全,注冊的服務(wù):
分別訪問http://localhost:8883/hello和http://localhost:8884/hello姜贡,結(jié)果如下:
更新git中的配置文件為:
POST方式請求Server端,用來更新配置文件
這里只是選擇了其中一個server端去更新母怜,任意一個都可以缚柏;
分別訪問http://localhost:8883/hello和http://localhost:8884/hello币喧,結(jié)果如下:
2個客戶端都獲取到了最新的數(shù)據(jù)杀餐,表示更新成功史翘;
將8888端口的Server端停掉冀续,再次更新配置文件為
POST方式請求Server端洪唐,用來更新配置文件
分別訪問http://localhost:8883/hello和http://localhost:8884/hello凭需,結(jié)果如下:
2個客戶端都獲取到了最新的數(shù)據(jù)功炮,表示更新成功薪伏;
總結(jié)
通過消息總線的方式解決了多個Client更新的問題粗仓,以及通過eureka來保證Server的高可用性借浊;當(dāng)然eureka注冊中心和消息總線本身也需要高可用性,這里就不過多介紹了存捺。