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 消息总线


分享到:


相關文章: