【前面的話】書接上文SpringCloud之Config,如果沒有看過可以先移步去看一下,在上一篇文章中提到了配置重繪的問題,如果需要重繪配置就需要客戶端執行refresh,我們可以利用webhook的機制每次提交代碼發送請求來重繪客戶端,當客戶端越來越多的時候,需要每個客戶端都執行一遍,這種方案就不太適合了,使用Spring Cloud Bus可以完美解決這一問題,
壹、Spring Cloud Bus的簡介
Spring cloud bus通過輕量訊息代理連接各個分布的節點,這會用在廣播狀態的變化(例如配置變化)或者其他的訊息指令,Spring bus的一個核心思想是通過分布式的啟動器對spring boot應用進行擴展,也可以用來建立一個多個應用之間的通信頻道,目前唯一實作的方式是用AMQP訊息代理作為通道,同樣特性的設定(有些取決于通道的設定)在更多通道的檔案中,
貳、解決方案
方案一:
- Spring cloud bus被國內很多都翻譯為訊息總線,也挺形象的,大家可以將它理解為管理和傳播所有分布式專案中的訊息既可,其實本質是利用了MQ的廣播機制在分布式的系統中傳播訊息,目前常用的有Kafka和RabbitMQ,利用bus的機制可以做很多的事情,其中配置中心客戶端重繪就是典型的應用場景之一,我們用一張圖來描述bus在配置中心使用的機制,

根據此圖我們可以看出利用Spring Cloud Bus做配置更新的步驟:
1、提交代碼觸發post給客戶端A發送/actuator/bus-refresh
2、客戶端A接收到請求從Server端更新配置并且發送給Spring Cloud Bus
3、Spring Cloud bus接到訊息并通知給其它客戶端
4、其它客戶端接收到通知,請求Server端獲取最新配置
5、全部客戶端均獲取到最新的配置
方案二:
- 在方案一中我們已經到達了利用訊息總線觸發一個客戶端/actuator/bus-refresh,而重繪所有客戶端的配置的目的,但這種方式并不優雅,原因如下:
打破了微服務的職責單一性,微服務本身是業務模塊,它本不應該承擔配置重繪的職責,
破壞了微服務各節點的對等性,
有一定的局限性,例如,微服務在遷移時,它的網路地址常常會發生變化,此時如果想要做到自動重繪,那就不得不修改WebHook的配置,
因此我們將方案一的架構模式稍微改變一下

這時Spring Cloud Bus做配置更新步驟如下:
1、提交代碼觸發post請求給bus/refresh
2、server端接收到請求并發送給Spring Cloud Bus
3、Spring Cloud bus接到訊息并通知給其它客戶端
4、其它客戶端接收到通知,請求Server端獲取最新配置
5、全部客戶端均獲取到最新的配置
下面我們就采用方案二來改造我們的工程,這樣的話我們在server端的代碼做一些改動,來支持bus/refresh
叁、改造服務端
- 改造上文的config的服務端子工程lovin-config-server,添加RabbitMQ的依賴,下面是改造后的主要的pom依賴:
<parent>
<artifactId>lovincloud</artifactId>
<groupId>com.eelve.lovincloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lovin-config-server</artifactId>
<packaging>jar</packaging>
<name>lovinconfigserver</name>
<version>0.0.1</version>
<description>配置服務端</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-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 添加rabbitmq的連接配置
server:
port: 8886 # 服務埠號
spring:
application:
name: lovinconfigserver # 服務名稱
security:
basic:
enabled: true
user:
name: lovin
password: ${REGISTRY_SERVER_PASSWORD:lovin}
cloud:
config:
server:
git:
uri: https://github.com/lovinstudio/lovincloud
search-paths: lovin-config-repo
label: master
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
serviceUrl:
defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注冊到的eureka服務地址
肆、改造配置客戶端
- 改造上文的config的服務端子工程lovin-config-client,添加RabbitMQ的依賴,下面是改造后的主要的pom依賴:
<parent>
<artifactId>lovincloud</artifactId>
<groupId>com.eelve.lovincloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lovin-config-client</artifactId>
<packaging>jar</packaging>
<name>lovinconfigclient</name>
<version>0.0.1</version>
<description>配置消費端</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-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.6</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-config-server</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 添加連接rabbitmq的相關配置
- 修改bootstrap.yml添加連接rabbitmq的配置
server:
port: 8807 # 服務埠號
spring:
application:
name: lovinconfigclient # 服務名稱
security:
basic:
enabled: true
user:
name: lovin
password: ${REGISTRY_SERVER_PASSWORD:lovin}
#eureka:
# client:
# serviceUrl:
# defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注冊到的eureka服務地址
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
- 修改application.yml開啟訊息跟蹤
spring:
cloud:
config:
name: lovin-config
profile: dev
#uri: http://localhost:8886/
#label: master
discovery:
enabled: true
service-id: lovinconfigserver
bus:
trace:
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注意在高可用的時候需要見注冊中心配置移到該檔案中,在application.yml中見會讀取不到配置
伍、啟動測驗
- 1.首先依次啟動lovin-eureka-server、lovin-econfig-server、lovin-econfig-client
- 2.查看lovin-econfig-server查詢配置

- 3.查看lovin-econfig-client查詢配置

- 4.修改配置,并提交見token的值由lovin改為lovinupdate

- 5.再次查看lovin-econfig-server查詢配置

- 6.再次查看lovin-econfig-client查詢配置

- 7.重繪訊息總線
由于api變更,url由老版本的/bus/refresh變為actuator/bus-refresh

- 8.再次查看lovin-econfig-client查詢配置

我們可以看到已經重繪成功,至此訊息總線配置已經完成
陸、區域重繪
某些場景下(例如灰度發布),我們可能只想重繪部分微服務的配置,此時可通過/actuator/bus-refresh端點的destination引數來定位要重繪的應用程式,
- 例如:/actuator/bus-refresh?destination=customers:8000,這樣訊息總線上的微服務實體就會根據destination引數的值來判斷是否需要要重繪,其中,customers:8000指的是各個微服務的ApplicationContext ID,destination引數也可以用來定位特定的微服務,
- 例如:/actuator/bus-refresh?destination=customers:**,這樣就可以觸發customers微服務所有實體的配置重繪,
- 最后的最后是本博客的原始碼,歡迎關注這一套SpringCloud的實踐
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244581.html
標籤:其他
上一篇:JAVA基礎語法
下一篇:javaSE 8
