7--SpringCloud搭建消息總線

  先回顧一下,在以前的Spring Cloud Config的介紹中,咱們還留了一個懸念:如何實現對配置信息的實時更新。雖然,咱們已經可以經過/refresh接口和Git倉庫的Web Hook來實現Git倉庫中的內容修改觸發應用程序的屬性更新。可是,若全部觸發操做均須要咱們手工去維護Web Hook中的應用位置的話,這隨着系統的不斷擴張,會變的愈來愈難以維護,而消息代理中間件是解決該問題最爲合適的方案。是否還記得咱們在介紹消息代理中的特色時有提到過這樣一個功能:消息代理中間件能夠將消息路由到一個或多個目的地。利用這個功能,咱們就能完美的解決該問題,下面咱們來講說Spring Cloud Bus中的具體實現方案。html

RabbitMQ實現

準備工做

   這裏咱們不作新的應用,但須要用到上一章中,咱們已經實現的關於Spring Cloud Config的幾個工程,若讀者對其還不瞭解,建議先閱讀java

  5--SpringCloud搭建分佈式配置中心git

  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服務;併發

 擴展config-client應用

  修改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>

 

 

在配置文件中增長關於RabbitMQ的鏈接和用戶信息 

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)
  • 先訪問兩個config-client的/from請求,會返回當前的from屬性。
  • 接着,咱們修改5--SpringCloud--Config/ghghspace-dev.properties中的from屬性值,併發送POST請求到其中的一個/bus/refresh
  • 最後,咱們再分別訪問啓動的兩個config-client的/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搭建消息總線

相關文章
相關標籤/搜索