Spring Cloud Bus 消息总线

Posted by 彭楷淳 on 2021-02-07
Estimated Reading Time 4 Minutes
Words 1.1k In Total
Viewed Times

Spring Cloud Bus 简介


Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍。

我们通常会使用消息代理来构建一个主题,然后把微服务架构中的所有服务都连接到这个主题上去,当我们向该主题发送消息时,所有订阅该主题的服务都会收到消息并进行消费。使用 Spring Cloud Bus 可以方便地构建起这套机制,所以 Spring Cloud Bus 又被称为消息总线。Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka,下面以 RabbitMQ 为例来演示下使用Spring Cloud Bus 动态刷新配置的功能。

RabbitMQ 的安装


安装 Erlang,下载地址:erlang.org/download/ot…

安装RabbitMQ,下载地址:dl.bintray.com/rabbitmq/al…

安装完成后,进入 RabbitMQ 安装目录下的 sbin 目录,在地址栏输入 cmd 并回车启动命令行,然后输入以下命令启动管理功能:

1
$ rabbitmq-plugins enable rabbitmq_management

访问地址查看是否安装成功:http://localhost:15672/

输入账号密码并登录:guest guest

动态刷新配置


使用 Spring Cloud Bus 动态刷新配置需要配合 Spring Cloud Config 一起使用,我们使用之前文章中的 config-server、config-client 模块来演示下该功能。

给 config-server 添加消息总线支持

在 pom.xml 中添加相关依赖

1
2
3
4
5
6
7
8
<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>

添加配置文件 application-amqp.yml,主要是添加了 RabbitMQ 的配置及暴露了刷新配置的 Actuator 端点;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server:
port: 8904
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/antoniopeng/springcloud-config.git
username: antonio
password: 123456
clone-on-start: true # 开启启动时直接从git获取配置
rabbitmq: #rabbitmq相关配置
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'

给 config-client 添加消息总线支持

在pom.xml中添加相关依赖:

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

添加配置文件 bootstrap-amqp1.yml 及 bootstrap-amqp2.yml 用于启动两个不同的 config-client,两个配置文件只有端口号不同;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server:
port: 9004
spring:
application:
name: config-client
cloud:
config:
profile: dev #启用环境名称
label: dev #分支名称
name: config #配置文件名称
discovery:
enabled: true
service-id: config-server
rabbitmq: #rabbitmq相关配置
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints:
web:
exposure:
include: 'refresh'

动态刷新配置演示

我们先启动相关服务,启动 eureka-server,以 application-amqp.yml 为配置启动 config-server,以 bootstrap-amqp1.yml 为配置启动 config-client,以 bootstrap-amqp2.yml 为配置再启动一个 config-client,启动后注册中心显示如下:

img

启动所有服务后,我们登录RabbitMQ的控制台可以发现Spring Cloud Bus 创建了一个叫springCloudBus的交换机及三个以 springCloudBus.anonymous开头的队列:

img

img

我们先修改 Git 仓库中 dev 分支下的 config-dev.yml 配置文件:

1
2
3
4
5
6
# 修改前信息
config:
info: "config info for dev(dev)"
# 修改后信息
config:
info: "update config info for dev(dev)"

调用注册中心的接口刷新所有配置:http://localhost:8904/actuator/bus-refresh

img

刷新后再分别调用 http://localhost:9004/configInfohttp://localhost:9005/configInfo 获取配置信息,发现都已经刷新了

1
update config info for dev(dev)

如果只需要刷新指定实例的配置可以使用以下格式进行刷新,我们这里以刷新运行在 9004 端口上的 config-client 为例 http://localhost:8904/actuator/bus-refresh/config-client:9004

配合 WebHooks 使用


WebHooks 相当于是一个钩子函数,我们可以配置当向 Git 仓库 push 代码时触发这个钩子函数,这里以 Gitee 为例来介绍下其使用方式,这里当我们向配置仓库 push 代码时就会自动刷新服务配置了。

img

更多干货请移步:https://antoniopeng.com


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !