SpringCloud(八):springcloud-bus消息總線(刷新配置服務)

Bus消息總線

好了如今咱們接着上一篇的隨筆,繼續來說。上一篇咱們講到,咱們若是要去更新全部微服務的配置,在不重啓的狀況下去更新配置,只能依靠spring cloud config了,可是,是咱們要一個服務一個服務的發送post請求,html

咱們能受的了嗎?這比以前的沒配置中心好多了,那麼咱們如何繼續避免挨個挨個的向服務發送Post請求來告知服務,你的配置信息改變了,須要及時修改內存中的配置信息。java

這時候咱們就不要忘記消息隊列的發佈訂閱模型。讓全部爲服務來訂閱這個事件,當這個事件發生改變了,就能夠通知全部微服務去更新它們的內存中的配置信息。git

這時Bus消息總線就能解決,你只須要在springcloud Config Server端發出refresh,就能夠觸發全部微服務更新了。web

Spring Cloud Bus除了支持RabbitMQ的自動化配置以外,還支持如今被普遍應用的Kafka。在本文中,咱們將搭建一個Kafka的本地環境,並經過它來嘗試使用Spring Cloud Bus對Kafka的支持,實現消息總線的功能。spring

window下安裝kafka和zooker,超詳細:https://blog.csdn.net/weixin_33446857/article/details/81982455apache

kafka:安裝下載教程網址(CentOS Linux):http://www.javashuo.com/article/p-uezkozpd-ez.htmlbootstrap

zooker的下載安裝網址:https://blog.csdn.net/ring300/article/details/80446918app

項目: 一個服務端。2個客戶端。maven

 

pom文件:spring-boot

<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>
  <groupId>com.demo</groupId>
  <artifactId>springcloud_serviceClient2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
    
     <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>   

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
         
 <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.3.4.RELEASE</version>
          </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-kafka</artifactId>
            <version>1.3.2.RELEASE</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
             <version>1.4.0.RELEASE</version>
        </dependency>
         <!--Spring Boot Actuator,感應服務端變化-->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

client1的配置文件要改成bootstrap.yml,由於這種配置格式,是優先加載的,上一篇隨筆有講過,client2的配置以下:

server: port: 7008 spring: application: name: config2 cloud: config: label: master #啓動什麼環境下的配置,dev 表示開發環境,這跟你倉庫的文件的後綴有關,好比,倉庫配置文件命名格式是cloud-config-dev.properties,因此profile 就要寫dev profile: dev name: cloud-config discovery: enabled: true #這個名字是Config Server端的服務名字,不能瞎寫。 service-id: CONFIG-SERVER management: #是否須要權限拉去,默認是true,若是不false就不容許你去拉取配置中心Server更新的內容 security: enabled: false #註冊中心 eureka: client: service-url: defaultZone: http://localhost:8001/eureka/

啓動類:

package cn.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ClientApplication2 { public static void main(String[] args) { SpringApplication.run(ClientApplication2.class, args); System.out.println("啓動成功!");

controller類:

package cn.demo.web; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class Controller { /*@Value("${spring.cloud}") private String config; @GetMapping("/test/config") public String test() { return config; }*/ @Value("${name}") private String name; @Value("${age}") private Integer age; @RequestMapping("/test") public String test(){ return this.name+this.age; } }

接着將client2中的的代碼基本和client的同樣,只是暴露服務的端口不一樣。

而後:

把zooker,kafka啓動;(標題下面連接)

把前面的工程,1個註冊中心,一個springcloud-config-server,兩個springcloud-config-client,springcloud-config-client1啓動起來,

 

 

 能夠看到springcloudBus是在0分片上,若是兩個config-client啓動都出現上面信息,證實啓動成功了。

訪問:http://localhost:7000/cloud-config-dev.properties

 

 

 再訪問兩個client,以下:

http://localhost:7006/test      http://localhost:7008/test

 

 

 好了,好戲開始了,如今咱們去git倉庫上修改配置中心的文件,將年齡改成24,以下:

 

 接下來,咱們咱們用refresh刷新配置服務端7000配置,通知兩個client去更新內存中的配置信息。用postman發送localhost:7000/bus/refresh,以下:

注意:spring1.x和spring2.x 刷新的路徑不同。

 

----------------------------------------------------

 看一下返回的結果:

能夠看到沒有返回什麼信息,可是不要擔憂,這是成功的通知全部client去更新了內存中的信息了。

接着咱們分別從新請求config-server,兩個client,刷新頁面,結果以下:

 

 

 

到目前爲止,上面都是刷新說有的配置的信息的,若是咱們想刷新某個特定服務的配置信息也是能夠的。咱們能夠指定刷新範圍,以下:

指定刷新範圍

  上面的例子中,咱們經過向服務實例請求Spring Cloud Bus的/bus/refresh接口,從而觸發總線上其餘服務實例的/refresh。可是有些特殊場景下(好比:灰度發佈),咱們但願能夠刷新微服務中某個具體實例的配置。

  Spring Cloud Bus對這種場景也有很好的支持:/bus/refresh接口還提供了destination參數,用來定位具體要刷新的應用程序。好比,咱們能夠請求/bus/refresh?destination=服務名字:9000,此時總線上的各應用實例會根據destination屬性的值來判斷是否爲本身的實例名,

若符合才進行配置刷新,若不符合就忽略該消息。

  destination參數除了能夠定位具體的實例以外,還能夠用來定位具體的服務。定位服務的原理是經過使用Spring的PathMatecher(路徑匹配)來實現,好比:/bus/refresh?destination=customers:**,該請求會觸發customers服務的全部實例進行刷新。

相關文章
相關標籤/搜索