Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線

上一節我們講了《Spring Cloud 微服務入門教程(五):統一配置中心-ConfigService》實現了統一管理配置,在文末我也說了依賴重啟才能自動拉取配置,所以本章節就講一下利用Spring Cloud BUS 消息總線來自動更新配置文件,這將實現應用無需重啟就可以熱更新配置文件。

必要的環境

在開始之前,我們還需要一些必要的環境,那就是提供消息隊列服務的RabbitMQ,RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。安裝非常簡單,無論是本機安裝還是使用Docker運行都是十分方便的,文章討論Spring Cloud微服務架構,RabbitMQ的安裝就不在此贅述了,非常簡單,下載地址:https://www.rabbitmq.com/download.html

從此章節以後,都依賴RabbitMQ消息隊列


改造配置中心和需要更新配置的服務

首先我們以改造配置中心為例,其他需要動態更新配置的服務也是一樣的改造方式。首先我們需要修改POM文件,增加一個依賴:spring-cloud-starter-bus-amqp,例如配置中心的POM文件:

<code>
<project> 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">
<parent>
<artifactid>cloud/<artifactid>
<groupid>net.renfei/<groupid>
<version>1.0.0/<version>
/<parent>
<modelversion>4.0.0/<modelversion>
<groupid>net.renfei/<groupid>
<artifactid>config/<artifactid>
<version>1.0.0/<version>
<name>config/<name>

<description>配置中心/<description>
<dependencies>
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-config-server/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<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>
/<project>/<code>

然後修改application.yml中rabbitmq的配置,如果不寫就是默認的,因為要演示給大家,所以我就寫出了默認的配置,以配置中心模塊為例:

<code>server:
port: 8114
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/NeilRen/SpringCloudDemo.git
search-paths: springcloud-config
# username:
# password:
# basedir:

rabbitmq:
addresses: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
management:
endpoints:
web:
exposure:
include: "*"/<code>

其他需要動態更新配置的服務也是同樣的改造方法,改造好後,怎麼使用呢?我們只需要給統一配置中心模塊發送一個 POST 信號即可,我這裡演示的同意配置中心地址是:http://localhost:8114/actuator/bus-refresh,然後我使用的是 curl 命令模擬 POST 請求,當然你們用其他可以發POST請求的客戶端都可以,例如 POSTMAN。如果返回的是404錯誤,那需要檢查一下bus-refresh接口是否暴露出來,在配置文件裡是:management.endpoints.web.exposure.include,我在演示系統裡是個星號,代表暴露所有接口。

給 /actuator/bus-refresh 發送一個POST信號以後,我們看一下RabbitMQ的界面,上面已經可以看到各個服務收發消息的情況了:


Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線


Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線


使用Git的WebHooks自動更新

有的同學就會問,每次更新還是得人工發送POST請求嗎?其實我們可以利用Git提供的WebHooks來發送信號,無論是Github還是Gitlab,他們都提供WebHooks這個功能。原理就是Git上的WebHooks更新調用config server的/monitor(spring-cloud-config-monitor)觸發RefreshRemoteApplicationEvent事件,然後spring cloud bus的StreamListener監聽RemoteApplicationEvent,通過mq發佈到每個config client,然後client接收RemoteApplicationEvent事件來實現refresh。

我使用Github舉例:在Git項目設置裡選擇WebHooks,然後點擊添加,輸入可以訪問到/monitor的鏈接地址,Content type選擇 json,然後選擇“Just the push event.”只有push的時候才發送通知。


Spring Cloud 微服務入門教程(六):Spring Cloud BUS 消息總線


分享到:


相關文章: