Spring Cloud 微服务入门教程(一):微服务介绍 Spring Cloud 微服务入门教程(二):服务注册与发现-Eureka Spring Cloud 微服务入门教程(三):微服务的注册 Spring Cloud 微服务入门教程(四):微服务间的调用消费-FeignClient Spring Cloud 微服务入门教程(五):统一配置中心-ConfigService Spring Cloud 微服务入门教程(六):Spring Cloud BUS 消息总线实现配置中心动态更新配置文件 Spring Cloud 微服务入门教程(七):Spring Cloud Stream 消息队驱动式的微服务 Spring Cloud 微服务入门教程(八):Spring Cloud Zuul 服务网关动态路由和Cookie头信息传递和跨域 Spring Cloud 微服务入门教程(九):网关 Zuul 整合 Swagger2 实现自动生成 RESTful API 文档 Spring Cloud 微服务入门教程(十):Spring Cloud Hystrix 服务熔断和服务降级 Spring Cloud 微服务入门教程(十一):Spring Cloud Sleuth zipkin 服务追踪链路监控 Spring Cloud 微服务入门教程(十二):Spring Cloud Docker 容器化部署
代码 将在https://github.com/NeilRen/SpringCloudDemo进行分享,按不同的分支分享不同的章节代码,Master分支就是最后所有的内容合集。本章节代码在:https://github.com/NeilRen/SpringCloudDemo/tree/feature/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文件:
<?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">
<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>
然后修改application.yml中rabbitmq的配置,如果不写就是默认的,因为要演示给大家,所以我就写出了默认的配置,以配置中心模块为例:
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: "*"
其他需要动态更新配置的服务也是同样的改造方法,改造好后,怎么使用呢?我们只需要给统一配置中心模块发送一个 POST 信号即可,我这里演示的同意配置中心地址是:http://localhost:8114/actuator/bus-refresh,然后我使用的是 curl 命令模拟 POST 请求,当然你们用其他可以发POST请求的客户端都可以,例如 POSTMAN。如果返回的是404错误,那需要检查一下bus-refresh接口是否暴露出来,在配置文件里是:management.endpoints.web.exposure.include,我在演示系统里是个星号,代表暴露所有接口。
给 /actuator/bus-refresh 发送一个POST信号以后,我们看一下RabbitMQ的界面,上面已经可以看到各个服务收发消息的情况了:

使用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的时候才发送通知。
