Spring Cloud 学习纪要五:Bus

本文介绍如何使用SpringCloud Bus实现配置的动态刷新,避免应用重启。通过整合RabbitMQ作为消息总线,当配置发生变化时,能自动通知各微服务节点,实现配置的实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Cloud Bus:消息总线

  上一篇我们讲到统一配置中心Spring Cloud Config,实现了分布式项目配置文件的统一管理,但是留下了一个问题:修改配置之后如何免重启自动生效。Spring Cloud Bus组件就可以用来做这件事,值得注意的是,前面我们所使用的版本Greenwich.M1的bus组件存在bug,我们将config和provider项目改为如下版本(其他项目建议一并修改):

开发环境版本
IDEA2018.2.6
JDK1.8
Spring Boot2.0.6
Spring CloudFinchley.SR2
Docker18.09.0
RabbitMQ3.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端口的服务也需要能正常运行。
MQ管理页面

修改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自动为我们创建了两个消息队列,如图所示。
Queue
  此时我们访问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的管理界面可以看到消息的消费情况,如图所示。
MQ
  最后刷新http://localhost:8081/hello/chung页面,发现内容变成了Hello Chung By Provider on env:devDynamic,证明我们实现了免重启修改配置。

配置GitHub的Webhooks

  真实场景下,我们不可能每次修改配置后手动做一下post请求,而Webhook为我们提供了这样的功能。
  如果本机IP为内网地址,可以提前准备一下内网穿透工具,视个人情况而定。
NATAPP
  在我们的配置文件git仓库中,找到设置页面的Webhooks选项,将Payload URL设置为${your_url}/monitor,Content Type选择application/json,点击添加Webhook按钮。
Webhook
  最后我们再修改git上的配置文件内容,稍候几秒刷新页面,发现能够真正实现免重启自动更新配置,详细内容和截图不再赘述。

附件

本系列纪要博客源码:跳转到github
本系列纪要博客配置文件:跳转到github

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值