Spring Cloud Bus:消息总线
上一篇我们讲到统一配置中心Spring Cloud Config,实现了分布式项目配置文件的统一管理,但是留下了一个问题:修改配置之后如何免重启自动生效。Spring Cloud Bus组件就可以用来做这件事,值得注意的是,前面我们所使用的版本Greenwich.M1的bus组件存在bug,我们将config和provider项目改为如下版本(其他项目建议一并修改):
开发环境 | 版本 |
---|---|
IDEA | 2018.2.6 |
JDK | 1.8 |
Spring Boot | 2.0.6 |
Spring Cloud | Finchley.SR2 |
Docker | 18.09.0 |
RabbitMQ | 3.7.8-management |
特别注意:本系列纪要环环相扣,建议从第一节开始阅读 点击跳转
bug官方github issue链接为https://github.com/spring-cloud/spring-cloud-bus/issues/137,可自行查阅。
准备工作
进行本章内容的学习前期需要准备好环境:Docker的安装、RabbitMQ容器的安装和运行、虚拟机IP到宿主机IP的映射等。
简而言之,访问http://localhost:15672,应可以到达RabbitMQ管理界面,当然,5672端口的服务也需要能正常运行。
修改Config项目配置
Maven依赖
在配置中心项目中添加bus组件的依赖,以及后续会用到的actuator和monitor依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</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-actuator</artifactId>
</dependency>
配置
暴露配置中心的各项接口,在配置文件添加如下内容:
management:
endpoints:
web:
exposure:
include: "*"
修改provider项目
我们以provider项目为例,添加bus组件的Maven依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改接口为动态读取配置项:
@RestController
@RequestMapping("/hello")
@RefreshScope // 使用该注解可在SpringCloudConfig配置刷新时自动更新本类配置
public class HelloController {
@Value("${env}")
private String env;
@GetMapping("/chung")
public String helloChung() {
return "Hello Chung By Provider on env:" + env;
}
}
验证配置项动态更新
先后运行config和provider项目(保证注册中心服务可用),发现RabbitMQ自动为我们创建了两个消息队列,如图所示。
此时我们访问provider的接口http://localhost:8081/hello/chung可以得到Hello Chung By Provider on env:dev
,接着我们修改git上的配置文件内容env的值env : devDynamic
,然后用postman或curl命令以post方式访问config暴露的接口http://127.0.0.1:8071/actuator/bus-refresh,RabbitMQ的管理界面可以看到消息的消费情况,如图所示。
最后刷新http://localhost:8081/hello/chung页面,发现内容变成了Hello Chung By Provider on env:devDynamic
,证明我们实现了免重启修改配置。
配置GitHub的Webhooks
真实场景下,我们不可能每次修改配置后手动做一下post请求,而Webhook为我们提供了这样的功能。
如果本机IP为内网地址,可以提前准备一下内网穿透工具,视个人情况而定。
在我们的配置文件git仓库中,找到设置页面的Webhooks选项,将Payload URL设置为${your_url}/monitor
,Content Type选择application/json,点击添加Webhook按钮。
最后我们再修改git上的配置文件内容,稍候几秒刷新页面,发现能够真正实现免重启自动更新配置,详细内容和截图不再赘述。
附件