Spring Cloud 消息总线之 Spring Cloud Bus

1,375 阅读3分钟

一、概述

  • Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
  • Spring Clud Bus目前支持RabbitMQ和Kafka。
  • Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。
  • Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改事件推送等,也可以当作微服务间的通信通道

1. 什么是总线

  • 在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。
  • 由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。
  • 在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。

2. 基本原理

  • ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。
  • 当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

二、RabbitMQ 安装

  • 这次使用RabbitMQ作为消息中间件。
  • 为了方便,在docker上面进行安装
  • 首先把镜像拉下来,然后运行。感谢这位老哥的博客
  • 设置了账号密码都是admin
sudo docker pull rabbitmq:management
docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
  • 打开之后,就可以通过端口15672监视状态了。
http://192.168.233.139:15672/

image.png

  • 看到上述页面表示已经开启成功了

三、实验

  • 本次实验基于上一次的配置中心
  • 上回说到,当git修改配置文件时,需要运维将客户端一个一个状态刷新,非常麻烦。现在可以在配置中心服务端和客户端都加上消息总线的方式,实现只需要刷新服务器,即可让客户端监听到并自动刷新。 image.png

1. 添加包

  • 无论是服务端还是客户端,都需要添加这个包。
<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2. 修改配置文件

  • 首先要告诉客户端和服务端,rabbitmq的url、端口号、账号密码。
spring:
    rabbitmq:
    host: 192.168.233.139
    port: 5672
    username: admin
    password: admin
  • 对于服务端来说,还要刷新配置的端点
##rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

3. 测试

  • 首先,开启所有机器。
  • 然后修改git上面的配置文件。
  • 然后,发送一个刷新配置中心服务器的请求curl -X POST "http://localhost:3344/actuator/bus-refresh"
  • 然后在客户端处尝试发送请求,获取当前配置,发现已经更新!
  • 若想更新指定的客户端,也可以添加一个端口号curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"。这样,就只更新3355端口的服务器了。

四、总结

image.png

  • 现在梳理一下过程
  1. 首先,配置中心服务器和客户端都在RabbitMQ上订阅主题。
  2. 然后运维人员修改了配置文件,并发送了一个post请求刷新服务端。
  3. 配置中心服务器收到了之后,发送一个刷新时间给MQ,告诉他配置文件发生了改变。
  4. 客户端监听到之后,知道配置文件发生了变化,就主动去配置中心服务器重新获取配置。
  • 至此就完成了配置文件的动态更新。