Spring Cloud之消息总线

Spring Cloud之配置中心一文中,我们介绍了如何利用配置中心和Git仓库来对应用程序中的属性进行刷新和配置。即通过Github或Gitlab提供的WebHook服务通知各应用程序来刷新。但是随着微服务产品增多,如果对每个微服务都发送一个post请求会越来越难以维护。因此需要一个消息代理,我们只需要通知一个微服务,再由其发送消息到每个微服务实现配置的热更新。Spring Cloud Bus即实现了类似的服务。

1. 准备测试服务

为了实现消息总线更新线上配置的功能,根据Spring Cloud之配置中心中的服务来继续开发:

  • Git Repo,存放配置文件。
  • Config Server,读取Git Repo下的配置文件,并以REST接口的形式供Client调用。
  • Client,客户端,读取配置的应用,可以理解为是你的具体应用。
  • RabbitMQ,消息中间件。

2. 原理说明

目前市面上比较热门的消息中间件产品是Kafka、RocketMQ、RabbitMQ,Spring Cloud Bus本质上是利用了消息中间件提供的广播功能,对各个微服务发消息。下图可以简单说明我们从push配置文件到各个微服务刷新配置的完整过程。

image

根据上图我们可以大致了解配置的更新流程:

  1. 开发人员push配置文件到Git仓库。
  2. Git仓库发送WebHook请求到Config Server。
  3. Config Server发送消息到RabbitMQ。
  4. 各个Client收到消息,重新拉取配置并更新。

3. 实现过程

3.1 增加依赖和配置

在Config Server和Client的项目中加入依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

配置文件中加入RabbitMQ的连接信息:

1
2
3
4
spring.rabbitmq.addresses=XXXXX
spring.rabbitmq.port=5672
spring.rabbitmq.username=user
spring.rabbitmq.password=pwd

3.2 启动服务

依次启动Eureka、Config Server和各个Client。

假设Config Server所在的机器IP为XX,修改Git Repo项目中的Webhook地址为:http://XX:port/bus/refresh 。并发送一个post请求。此时我们看到各个Client会重新拉取各自的配置。

4. 总结

通过使用Spring Cloud Bus,我们不再需要向每个客户端实例都发送更新请求,只需要在Webhook中通知Config Server,各个客户端收到消息后会主动拉取配置。这样能即大地方便开发人员更新线上的配置,对于系统运维来说,也能减少通知post的成本。

以上内容就是关于Spring Cloud微服务框架之消息总线的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh