上一章節,咱們講解了分佈式配置中心spring cloud config,咱們把配置項存放在git或者本地,當咱們修改配置時,須要從新啓動服務才能生效。可是在生產上,一個服務部署了多臺機器,從新啓動比較麻煩且會短暫影響用戶體驗。spring cloud生態在發展,確定有對應的解決之法,接下來將要講解的Spring Cloud Bus就是爲了解決這一難題而存在的。html
Spring Cloud Bus(消息總線)經過一個輕量級的消息中間件能夠鏈接分佈式系統中的各個節點。使用該總線來廣播某些狀態的改變(好比配置信息發生變動)或其餘管理指令。能夠說,消息總線是spring boot應用擴展「道路」上的推動器,並且也把它用來做應用間相互通訊的消息管道。java
1、項目搭建:git
1. 環境準備web
本章仍是基於上一章來實現的,上一章講解了git和本地配置兩種方式,配置刷新原理都是同樣的,此次咱們只講git配置修改後進行刷新。spring
上一章節內容能夠參考:一塊兒來學Spring Cloud | 第七章:分佈式配置中心(Spring Cloud Config)apache
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.haly</groupId> <artifactId>springcloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.haly</groupId> <artifactId>springcloud-feign-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-ribbon-client</name> <description>新建一個springcloud項目</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.haly</groupId> <artifactId>springcloud-config</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3. 在springcloud-feign-client模塊的application.properties中加上RabbitMq的配置,包括RabbitMq的地址、端口,用戶名、密碼。並加上spring.cloud.bus的三個配置:瀏覽器
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=young spring.rabbitmq.password=young spring.cloud.bus.enabled=true spring.cloud.bus.trace.enabled=true management.endpoints.web.exposure.include=bus-refresh
4. springcloud-feign-client模塊的啓動類上加上註解:@RefreshScopeapp
package com.haly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableFeignClients @EnableDiscoveryClient @RefreshScope public class SpringcloudFeignClientApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudFeignClientApplication.class, args); } }
5. springcloud-feign-client模塊的測試類FeignController,測試上一章節的/testconfig方法,具體內容能夠參考:一塊兒來學Spring Cloud | 第七章:分佈式配置中心(Spring Cloud Config) maven
package com.haly.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.haly.romote.FeignRemoteService; @RestController public class FeignController { @Autowired FeignRemoteService feignRemoteService; @Value("${configword}") String configword; @GetMapping(value = "/getHello") public String getHello(@RequestParam String name) { return feignRemoteService.hello(name); } @GetMapping(value = "/testzuul") public String testzuul(@RequestParam String name) { return name +",這是springcloud-feign-client的服務接口"; } @GetMapping(value = "/testconfig") public String testconfig(@RequestParam String name) { return name +",git配置值:" + configword ; } }
6. 運行項目分佈式
啓動springcloud-eureka-server,啓動springcloud-config-server,啓動springcloud-config,最後啓動springcloud-feign-client模塊
爲了測試配置修改,多個服務實例都能更新,就啓動兩個 springcloud-feign-client 實例,端口分別是9600,9601,sts啓動兩個實例(端口爲9600時啓動項目,而後將端口改爲9601,再啓動項目)。
瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農 或者輸入 http://localhost:9601/testconfig?name=young碼農
頁面展現結果:young碼農,git配置值:NewConfig !
7. 修改git配置,從新運行項目
這時咱們去代碼倉庫將configword的值改成「update config」,即改變配置文件configword的值。若是是傳統的作法,須要重啓服務,才能達到配置文件的更新。
如今,咱們只須要發送post請求:http://localhost:8881/actuator/bus-refresh,你會發現springcloud-feign-client會從新讀取配置文件,接着咱們查看頁面運行結果。
瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農 或者輸入 http://localhost:9601/testconfig?name=young碼農
頁面展現結果:young碼農,git配置值:update config !
2、總結:
使用"destination"參數,/actuator/bus-refresh接口能夠指定服務,例如 「/actuator/bus-refresh?destination=client:**」, 即刷新服務名爲client的全部服務。
經過上面的測試,咱們能夠知道當git文件更改的時候,用post 向端口爲8882的config-client發送請求/bus/refresh/;此時8882端口會發送一個消息,由消息總線向其餘服務傳遞,從而使整個微服務集羣都達到更新配置文件。
引入程序猿DD 畫的一張圖片,簡單理解一下刷新原理:
最後項目目錄結構: