在上篇中介紹了SpringCloud Config的使用,本篇則介紹基於SpringCloud(基於SpringBoot2.x,.SpringCloud Finchley版)中的分佈式配置中心(SpringCloud Config)的配置刷新和消息總線(RabbitMQ和Kafka)使用教程。html
在上一篇中咱們介紹了springcloud配置中心的本地使用和Git使用的用法,可是當從新修改配置文件提交後,客戶端獲取的仍然是修改前的信息,須要客戶端重啓才能夠獲取最新的信息。所以咱們須要客戶端可以動態進行更新,幸虧springcloud官方已經給出方案,因此咱們只須要使用就好了。git
開發環境github
注:不必定非要用上述的版本,能夠根據狀況進行相應的調整。須要注意的是SpringBoot2.x之後,jdk的版本必須是1.8以上!web
確認了開發環境以後,咱們再來添加相關的pom依賴。spring
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
服務端以及註冊中心這塊配置和代碼和以前springcloud-config配置基本同樣便可。註冊中心新項目的的名稱爲springcloud-config-bus-eureka
,服務端新項目的的名稱爲springcloud-config-bus-server
。bootstrap
註冊中心pom
配置、application.properties
配置和代碼以下:瀏覽器
pom:springboot
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.properties:app
spring.application.name=springcloud-config-bus-eureka server.port=8006 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
代碼:分佈式
@SpringBootApplication @EnableEurekaServer public class ConfigBusEurekaApplication { public static void main(String[] args) { SpringApplication.run(ConfigBusEurekaApplication.class, args); System.out.println("config bus 註冊中心服務啓動..."); } }
服務端pom
配置、application.properties
配置和代碼以下:
pom:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
application.properties:
spring.application.name=springcloud-config-server server.port=9005 eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/ spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/ spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo spring.cloud.config.server.git.username = spring.cloud.config.server.git.password =
代碼:
@EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); System.out.println("配置中心服務端啓動成功!"); } }
客戶端這邊在以前springcloud-config-client項目中進行改造,新項目的的名稱爲springcloud-config-bus-client
,在pom文件中新增以下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
spring-boot-starter-actuator
表示對該程序進行監控,能夠經過http接口獲得該程序的各類信息,詳細的使用能夠查看個人這個項目springboot-actuator,能夠在註釋中查詢各類接口的使用。
而後再到配置文件application.properties
中添加以下配置:
management.endpoints.web.exposure.include=refresh
該配置表示暴露刷新的地址爲refresh。
注:若是是SpringBoot1.x的版本,那麼配置改爲management.security.enabled=false
便可。
最後在客戶端的Controller增長一個@RefreshScope
註解,該註解表示在接到SpringCloud配置中心配置刷新的時候,自動將新的配置更新到該類對應的字段中。
@RestController @RefreshScope public class ClientController { @Value("${word}") private String word; @RequestMapping("/hello") public String index(@RequestParam String name) { return name+","+this.word; } }
完成上述的代碼開發後,咱們來進行測試Spring-Config是否能夠進行配置實時更新。
首先依次啓動springcloud-config-bus-eureka
、springcloud-config-bus-server
和springcloud-config-bus-client
這三個項目。其中9005是服務端springcloud-config-bus-server
的端口,9006是第一個客戶端springcloud-config-bus-client
的端口。
啓動成功以後,在瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello world!!
能夠正常獲得服務端configtest-pro.properties
的配置信息。
而後在把configtest-pro.properties
的配置更改成:
word=hello
而後咱們再瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello world!!
能夠發現配置並無實時的刷新,查閱官方文檔得知,須要客戶端經過POST方法觸發各自的/refresh,因此這裏咱們就用Postman工具模擬post請求刷新,而後再查看信息。
使用POST請求以下地址:
http://localhost:9006/actuator/refresh
返回:
[ "word" ]
說明完成了word配置的刷新,咱們再瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello
發現已經成功實現配置刷新了!
示例圖:
上述的示例中,咱們客戶端發現每次獲取最新配置都須要手動進行刷新,若是少的的話還可使用,可是多的話就比較繁瑣了,雖然咱們可使用相似Github的WebHook的工具。
WebHook是當某個事件發生時,經過發送http post請求的方式來通知信息接收方。
可是當客戶端愈來愈多的時候WebHook已經很差使用了,每次新增客戶端都須要更改WebHook會顯得很麻煩,springcloud官方給出了很是好的解決方案,Spring Cloud Bus
。
Spring cloud bus經過輕量消息代理鏈接各個分佈的節點。這會用在廣播狀態的變化(例如配置變化)或者其餘的消息指令。Spring bus的一個核心思想是經過分佈式的啓動器對spring boot應用進行擴展,也能夠用來創建一個多個應用之間的通訊頻道。目前惟一實現的方式是用AMQP消息代理做爲通道,一樣特性的設置(有些取決於通道的設置)在更多通道的文檔中。
爲何使用Spring Cloud Bus
就能夠解決這個問題了呢?
咱們不必定非要透徹的理解其原理才能夠知道,咱們只須要知道它的實現步驟,就能夠知道了爲何能夠解決了。
步驟以下:
這裏我也簡單的畫了下使用Spring Cloud Bus
以前和以後的流程圖,方便進行理解。
不使用Spring Cloud Bus
獲取配置信息流程圖:
使用Spring Cloud Bus
獲取配置信息流程圖:
和上述的環境同樣便可。
RabbitMQ 的安裝教程能夠看我以前寫的這篇文章:RabbitMQ的環境安裝及配置。
Kafka 的安裝教程能夠看我以前寫的這篇文章:kafka安裝使用教程。
Spring Cloud Bus 主要的使用的MQ主要使用的是,RabbitMQ和Kafka。至於使用的話就能夠根據狀況來進行選擇,主要使用的是哪一個MQ就用哪個就好了。這裏咱們就用RabbitMQ做爲示例來進行講解,Kafka的使用也差很少,也無在意配置更改而已。
首先在springcloud-config-bus-server
服務端的pom文件添加以下配置:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies>
注: spring-boot-starter-actuator
這個是必須的,否則是沒法在服務端進行配置刷新請求的。若是是使用的kafka的話,只需將spring-cloud-starter-bus-amqp
改爲spring-cloud-starter-bus-kafka
便可。
而後再到配置文件中添加以下配置:
配置信息:
spring.application.name=springcloud-config-bus-server server.port=9005 eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/ spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/ spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo spring.cloud.config.server.git.username = spring.cloud.config.server.git.password = management.endpoints.web.exposure.include= bus-refresh spring.cloud.bus.enabled = true spring.cloud.bus.trace.enabled = true spring.rabbitmq.host:127.0.0.1 spring.rabbitmq.port:5672 spring.rabbitmq.username:guest spring.rabbitmq.password:guest
配置說明:
springcloud-config-bus-client
增長的的配置同樣,名稱不同是爲了作區分。注:若是是kafka的話,添加kafka的配置信息spring.kafka.bootstrap-servers
,填寫kafka的地址和端口便可。
服務端代碼和以前同樣便可,在程序主類中,額外添加@EnableConfigServer
註解,該註解表示啓用config配置中心功能。代碼以下:
@EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); System.out.println("配置中心服務端啓動成功!"); } }
完成上述代碼以後,咱們的配置中心服務端已經構建完成了。
註冊中心和以前保持一致就能夠了。
客戶端這邊的變更基本不大,增長一個rabbitmq的jar包和相應的配置文件便可。
在springcloud-config-bus-clinet
的pom文件添加以下配置:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies>
bootstrap.properties
文件的配置信息和以前的基本同樣,完整的配置以下:
配置信息:
spring.cloud.config.name=configtest spring.cloud.config.profile=pro spring.cloud.config.label=master spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=springcloud-config-bus-server eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/
配置說明:
注:上面這些與spring-cloud相關的屬性必須配置在bootstrap.properties中,config部份內容才能被正確加載。由於bootstrap.properties的相關配置會先於application.properties,而bootstrap.properties的加載也是先於application.properties。須要注意的是eureka.client.serviceUrl.defaultZone
要配置在bootstrap.properties,否則客戶端是沒法獲取配置中心參數的,會啓動失敗!
application.properties
配置文件新增的配置基本和服務端的同樣,完整的配置以下:
spring.application.name=springcloud-config-bus-client server.port=9006 management.endpoints.web.exposure.include=refresh spring.cloud.config.failFast=true spring.cloud.bus.trace.enabled = true spring.rabbitmq.host:127.0.0.1 spring.rabbitmq.port:5672 spring.rabbitmq.username:guest spring.rabbitmq.password:guest
配置說明:
程序主類代碼,和以前的基本一致。代碼以下:
主程序代碼示例:
@EnableDiscoveryClient @SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); System.out.println("配置中心客戶端啓動成功!"); } }
控制層代碼:
@RestController @RefreshScope public class ClientController { @Value("${word}") private String word; @RequestMapping("/hello") public String index(@RequestParam String name) { return name+","+this.word; } }
完成上述的項目開發以後,咱們把上面的項目複製一下,項目名稱爲springcloud-config-bus-client2
,而後把它的端口改成9007便可。
到此,客戶端的項目也就構建完成了。
完成如上的工程開發以後,咱們來進行測試。
咱們首先啓動RabbitMQ服務,而後再依次啓動springcloud-config-bus-eureka
、springcloud-config-bus-server
、springcloud-config-bus-client
和springcloud-config-bus-client2
這四個項目。其中9005是服務端springcloud-config-bus-server
的端口,9006是第一個客戶端springcloud-config-bus-client
的端口,9007是是第二個客戶端springcloud-config-bus-client2
的端口。
啓動成功以後,在瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello
在瀏覽器輸入:
http://localhost:9007//hello?name=xuwujing
界面返回:
xuwujing,hello
能夠正常獲得服務端configtest-pro.properties
的配置信息。
而後在把configtest-pro.properties
的配置更改成:
word=hello!!
而後在使用Postman工具進行發起POST請求,只不過此次的地址是服務端的地址和端口。
使用POST請求以下地址:
http://localhost:9005/actuator/bus-refresh
而後咱們再瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello!!
瀏覽器輸入:
http://localhost:9007//hello?name=pancm
界面返回:
xuwujing,hello!!
示例圖:
完成上述全局刷新測試以後,有時咱們只想刷新部分微服務的配置,那麼即可以使用/actuator/bus-refresh/{destination}
端點的 destination
參數來定位要刷新的應用程序。
咱們繼續更改configtest-pro.properties
的配置爲:
word=hello!!!
而後依舊使用Postman工具發送post請求,地址爲:
http://localhost:9005/actuator/bus-refresh/springcloud-config-bus-client2
而後咱們再瀏覽器輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello!!
瀏覽器輸入:
http://localhost:9007//hello?name=pancm
界面返回:
xuwujing,hello!!!
發現只有springcloud-config-bus-client2
客戶端的配置更新,另外一個springcloud-config-bus-client
沒有進行刷新,達到了咱們的目的。
示例圖:
上述示例完成以後,咱們把SpringCloud Config Refresh
的測試在進行一遍,發現依舊能夠實現,所以咱們發現只要開啓Spring Cloud Bus
後,不論是對服務端仍是客戶端,執行/actuator/bus-refresh
都是能夠更新配置的。
若是咱們想進行跟蹤總線事件的話,只須要在刷新配置以後,在地址後面添加/trace
或/actuator/httptrace
便可。
基於SpringBoot2.x、SpringCloud的Finchley版本開發的地址:https://github.com/xuwujing/springcloud-study
若是感受項目不錯,但願能給個star,謝謝!
原創不易,若是感受不錯,但願留言推薦!您的支持是我寫做的最大動力! 版權聲明: 做者:虛無境 博客園出處:http://www.cnblogs.com/xuwujing CSDN出處:http://blog.csdn.net/qazwsxpcm 我的博客出處:http://www.panchengming.com