先回顧一下,在以前的Spring Cloud Config的介紹中,咱們還留了一個懸念:如何實現對配置信息的實時更新。雖然,咱們已經可以經過/refresh
接口和Git倉庫的Web Hook來實現Git倉庫中的內容修改觸發應用程序的屬性更新。可是,若全部觸發操做均須要咱們手工去維護Web Hook中的應用位置的話,這隨着系統的不斷擴張,會變的愈來愈難以維護,而消息代理中間件是解決該問題最爲合適的方案。是否還記得咱們在介紹消息代理中的特色時有提到過這樣一個功能:消息代理中間件能夠將消息路由到一個或多個目的地。利用這個功能,咱們就能完美的解決該問題,下面咱們來講說Spring Cloud Bus中的具體實現方案。html
這裏咱們不作新的應用,但須要用到上一章中,咱們已經實現的關於Spring Cloud Config的幾個工程,若讀者對其還不瞭解,建議先閱讀java
6--SpringCloud搭建分佈式配置中心(續-高可用性)web
config-eurekaServer:服務註冊中心spring
config-server:配置了Git倉庫,並註冊到了Eureka的服務端。服務器
config-client:經過Eureka發現Config Server的客戶端,應用名爲ghghspace,用來訪問配置服務器以獲取配置信息。該應用中提供了一個/from
接口,它會獲取5--SpringCloud--Config /ghghspace-dev.properties
中的from屬性返回。架構
在本地安裝好RabbitMQ服務;併發
修改pom.xml
增長spring-cloud-starter-bus-amqp
模塊mvc
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
server.port=7002 #對應前配置文件中的{application}部分 spring.application.name=ghghspace eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ #參數設置爲true,開啓經過服務來訪問Config Server的功能 spring.cloud.config.discovery.enabled=true #指定配置中心的實例名 spring.cloud.config.discovery.serviceId=config-server #對應前配置文件中的{profile}部分 spring.cloud.config.profile=dev #對應前配置文件的git分支 spring.cloud.config.label=master #mq連接信息 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=gh spring.rabbitmq.password=123456
啓動config-server,再啓動兩個config-client(分別在不一樣的端口上,好比700二、7003),咱們能夠在config-client-eureka中的控制檯中看到以下內容,在啓動時候,客戶端程序多了一個/bus/refresh
請求。app
o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/bus/refresh],methods=[POST]}" onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpoint.refresh(java.lang.String)
/from
請求,會返回當前的from屬性。5--SpringCloud--Config
/ghghspace-dev.properties
中的from屬性值,併發送POST請求到其中的一個/bus/refresh
。/from
請求,此時這兩個請求都會返回最新的5--SpringCloud--Config
/ghghspace-dev.properties
中的from屬性。到這裏,咱們已經可以經過Spring Cloud Bus來實時更新總線上的屬性配置了。
咱們經過使用Spring Cloud Bus與Spring Cloud Config的整合,並以RabbitMQ做爲消息代理,實現了應用配置的動態更新。
整個方案的架構如上圖所示,其中包含了Git倉庫、Config Server、以及微服務「Service A」的三個實例,這三個實例中都引入了Spring Cloud Bus,因此他們都鏈接到了RabbitMQ的消息總線上。
當咱們將系統啓動起來以後,「Service A」的三個實例會請求Config Server以獲取配置信息,Config Server根據應用配置的規則從Git倉庫中獲取配置信息並返回。
此時,若咱們須要修改「Service A」的屬性。首先,經過Git管理工具去倉庫中修改對應的屬性值,可是這個修改並不會觸發「Service A」實例的屬性更新。咱們向「Service A」的實例3發送POST請求,訪問/bus/refresh
接口。此時,「Service A」的實例3就會將刷新請求發送到消息總線中,該消息事件會被「Service A」的實例1和實例2從總線中獲取到,並從新從Config Server中獲取他們的配置信息,從而實現配置信息的動態更新。
而從Git倉庫中配置的修改到發起/bus/refresh
的POST請求這一步能夠經過Git倉庫的Web Hook來自動觸發。因爲全部鏈接到消息總線上的應用都會接受到更新請求,因此在Web Hook中就不須要維護全部節點內容來進行更新,從而解決了經過Web Hook來逐個進行刷新的問題。
源碼下載:7--SpringCloud搭建消息總線