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文件:
<?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的时候才发送通知。

商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。微信订阅号
扫码关注「任霏博客」微信订阅号- 你写得非常清晰明了,让我很容易理解你的观点。
- 感谢分享!拿走了~
- 您是说 UCClient 类接收来自Discuz的UCenter的消息吧,请求是来自 Discuz 的 UCenter吗?code 为 null 说明请求URL地址中没有 code 参数 (?code=xxx) ,确定是 UCenter 发起的请求吗?
- String code = request.getParameter("code"); code一直是null 这是为什么啊
- 你好,我想问一下如果是分析型的数据库要怎么制作docker镜像呢 是修改V008R003C002B0320版本号吗
- 可以的,我也正在开发分享的程序,可以邮件或群联系我都可以,关于页面里有联系方式:https://www.renfei.net/page/about 。
- 有破解软件的需要可以私下联系您吗?
- 您好,手机APP只是个客户端,用于数据呈现展示,数据均保存在服务器上,只留个APP没有任何用处,无能为力哦。
- 老哥 看你弄了这么多软件好厉害啊。 我有个软件 我买过几个小会员 没用几天 然后商家跑路了,软件服务器关闭了,连不上去 用不了。 你能做成一个打补丁版本可以本地用的么? 方便看下么?https://haodezhe.lanzouw.com/iD0f30h9joza 谢谢老哥!
- 您好,由于版权投诉和我国知识产权法的完善,我已经下架所有破解软件的下载链接了。
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)
- ChatGPT 开发商 OpenAI 买下极品域名 AI.com
- 火爆的 AI 人工智能 ChatGPT 国内注册教程、使用方式和收费标准
- 解决 SpringCloud 中 bootstrap.yml 不识别 @activatedProperties@ 参数
- Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务
- 阿里云香港可用区C发生史诗级故障