微服務SpringCloud之配置中心和消息匯流排

  • 2019 年 10 月 3 日
  • 筆記

 在微服務SpringCloud之Spring Cloud Config配置中心SVN部落格中每個client刷新配置資訊時需要post請求/actuator/refresh,但客戶端越來越多時,,需要每個客戶端都執行一遍,這種方案就不太適合了。使用Spring Cloud Bus可以完美解決這一問題。

一、Spring Cloud Bus

Spring cloud bus通過輕量消息代理連接各個分布的節點。這會用在廣播狀態的變化(例如配置變化)或者其他的消息指令。Spring bus的一個核心思想是通過分散式的啟動器對spring boot應用進行擴展,也可以用來建立一個多個應用之間的通訊頻道。目前唯一實現的方式是用AMQP消息代理作為通道,同樣特性的設置(有些取決於通道的設置)在更多通道的文檔中。

Spring cloud bus被中國很多都翻譯為消息匯流排,也挺形象的。大家可以將它理解為管理和傳播所有分散式項目中的消息既可,其實本質是利用了MQ的廣播機制在分散式的系統中傳播消息,目前常用的有Kafka和RabbitMQ。利用bus的機制可以做很多的事情,其中配置中心客戶端刷新就是典型的應用場景之一,我們用一張圖來描述bus在配置中心使用的機制。

 

二、啟動RabbitMq

啟動RabbitMq的具體方法之前部落格已經寫了,略過。

三、SpringCloud Config Server端

1.引入依賴

Demo是在上篇部落格的基礎上進行修改,主要增加引入spring-cloud-starter-bus-amqp。

<?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>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.6.RELEASE</version>          <relativePath/> <!-- lookup parent from repository -->      </parent>      <groupId>com.example</groupId>      <artifactId>SpringCloudConfigServer</artifactId>      <version>0.0.1-SNAPSHOT</version>      <packaging>war</packaging>      <name>SpringCloudConfigServer</name>      <description>Demo project for Spring Boot</description>        <properties>          <java.version>1.8</java.version>          <spring-cloud.version>Greenwich.SR2</spring-cloud.version>      </properties>        <dependencies>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>          </dependency>          <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-client</artifactId>  </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-tomcat</artifactId>              <scope>provided</scope>          </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-test</artifactId>              <scope>test</scope>          </dependency>      </dependencies>        <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>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>

View Code

2.新增RabbitMq配置資訊

這裡主要增加開啟消息跟蹤、配置rabbitmq相關資訊。

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  management.endpoints.web.exposure.include=*

四、SpringCloud Config Client端

1.引入依賴

Client端和服務端有類似的配置,也是引入spring-cloud-starter-bus-amqp,增加rabbitmq相關配置。

<?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>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.6.RELEASE</version>          <relativePath/> <!-- lookup parent from repository -->      </parent>      <groupId>com.example</groupId>      <artifactId>SpringCloudConfigClient</artifactId>      <version>0.0.1-SNAPSHOT</version>      <packaging>war</packaging>      <name>SpringCloudConfigClient</name>      <description>Demo project for Spring Boot</description>        <properties>          <java.version>1.8</java.version>          <spring-cloud.version>Greenwich.SR2</spring-cloud.version>      </properties>        <dependencies>          <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.boot</groupId>    <artifactId>spring-boot-starter-actuator</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-bus-amqp</artifactId>  </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-tomcat</artifactId>              <scope>provided</scope>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>      </dependencies>        <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>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>

View Code

2.新增RabbitMq配置資訊

management.endpoints.web.exposure.include=*  ## 開啟消息跟蹤  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

五、測試

1.依次啟動EurekaServer、SpringCloudConfigServer、SpringCloudConfigClient,輸入http://localhost:8001/neo-config/devhttp://localhost:8003/hello

 

 

2.修改配置資訊

修改github上的配置資訊,再次輸入上面的url,在8003埠的是沒有更新的,此時需要post請求http://localhost:8001/actuator/bus-refresh來刷新SpringCloudConfigServer。這裡在post請求時可能會出現405、404的錯誤,需要設置management.endpoints.web.exposure.include=*,並且由於springcloud的版本不同,post請求的url也不同。

 

 post請求之後返回204,然後刷新即可看到最新的配置資訊。

 

 

 參考:http://www.ityouknow.com/springcloud/2017/05/26/springcloud-config-eureka-bus.html