在上一篇SpringCloud系列之Config中,我们介绍了如何使用Spring Cloud Config来搭建一套配置管理系统。通过Spring Cloud Config的Server和Client组件,可以完成配置的管理、获取和刷新。在处理配置刷新时,需要先修改配置,然后再手工发送POST请求到Client端的刷新端点上,这种方式虽然可以实现不停机变更配置的目的,但是在微服务架构下的生产环境中却并不优雅。
当生产环境中部署了大量应用时,如果还是通过人工的方式,一台台的去刷新显然不太合理。没有人愿意做这种费力又容易出错的事情!那么,在Spring Cloud Config下如何实现自动刷新配置呢?答案是
Spring Cloud Bus
。
Spring Cloud Bus
Spring Cloud Bus 是Spring Cloud对事件、消息总线的封装,它将分布式系统中的各个节点使用轻量级的消息代理连接起来,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
Spring Cloud Bus需要利用MQ进行事件、消息的传播与处理,目前常用的是RabbitMQ和Kafka,本文中涉及的MQ为RabbitMQ。所以,在开始之前,读者需要先安装RabbitMQ,由于不是本文的重点,在此不多赘述。
自动刷新原理
使用Spring Cloud Bus完成配置自动刷新的大致流程如下:
- 修改并PUSH配置,触发web hook,POST请求到Config Server的 bus/refresh端点
- Config Server向MQ发送配置变更消息
- Client集群中的实例订阅并接收到MQ投递的消息
- Client集群中的实例消费消息,从Config Server获取新配置,并刷新本地配置
实战
准备RabbitMQ
建议读者使用Docker进行安装,方便快捷,此处不深入介绍。
$ docker run -d --name rabbitmq -p 4369:4369 -p 5671:5671 -p 15672:15671 -p 16572:15672 rabbitmq:3-management |
配置Config Server
Config Server不需要做太多修改,仅需要增加必要的依赖和配置即可。
pom.xml增加依赖:
<dependency> |
application.yml增加RabbitMQ和security配置:
server: |
配置Client应用
与Config Server类似,进行添加必要的依赖和配置。
pom.xml增加依赖
<dependency> |
application.yml增加RabbitMQ和security配置:
server: |
配置webhook
github和gitlab都支持webhook,这里我使用的是gitlab。如果读者手头没有webhook环境,也可以使用Postman工具模拟。
⚠️10.242.14.174是我的机器IP,这里设置的是Config Server端端点,在gitlab中需要进行一点设置才可以访问局域网IP。
- 使用root账户登录
- 点击Admin area—>Settings,在 Outbound requests下将
Allow request to the local network from hooks and services
勾选
测试
启动Config Server应用
启动Config Client应用(config-example以local profile启动)
修改spring-cloud-config-repo下config-example目录中的application-local.properties文件,修改完push到git仓库
浏览器中访问
http://localhost:8088/test/config
,可以看到配置已变更。