问答题270/1053说说 Spring Cloud Bus 的原理?

难度:
2021-11-02 创建

参考答案:

Spring Cloud Bus 是一个事件总线,用于在分布式系统中广播消息,主要用于传播配置变更事件,实现 Spring Cloud Config 配置的实时更新。它通过消息中间件(如 RabbitMQ 或 Kafka)将事件分发到多个服务实例,达到全局通知的效果。


核心原理

  1. 消息传递机制

    • Spring Cloud Bus 依赖消息中间件(如 RabbitMQ、Kafka 等)作为消息传输通道。
    • 当服务 A 发送一个事件(如配置刷新事件)到消息通道,所有监听该通道的服务实例都会接收到这个事件。
  2. 事件驱动模型

    • 基于 Spring 的事件机制,Spring Cloud Bus 会将消息中间件的消息封装为 Spring ApplicationEvent,并在各个服务实例中分发、处理这些事件。
  3. 配置刷新事件传播

    • 当一个服务调用 /actuator/bus-refresh 端点时,会生成一个 RefreshRemoteApplicationEvent
    • 该事件会被发送到消息中间件,其他监听的服务实例接收此事件后会触发本地的配置刷新逻辑。

核心流程

1. 事件触发

  • 客户端发送 POST 请求到任意服务的 /actuator/bus-refresh 端点:
    1curl -X POST http://<server>/actuator/bus-refresh
  • 该服务会生成 RefreshRemoteApplicationEvent 并发布到消息中间件。

2. 消息广播

  • 消息中间件(RabbitMQ、Kafka)将事件广播到其他服务实例的消息队列中。

3. 事件接收

  • 每个服务实例都有一个消息监听器(由 Spring Cloud Stream 提供)。
  • 服务实例从消息中间件中消费事件,将其封装成 Spring 应用事件并发布到本地的 Spring 应用上下文。

4. 配置刷新

  • 各服务实例接收到 RefreshRemoteApplicationEvent 后,触发本地的刷新逻辑(调用 /actuator/refresh),重新加载配置。

架构图

[Client] --> [/actuator/bus-refresh] --> [Message Broker (RabbitMQ/Kafka)]
     ↓                                 ↙                ↘
[Service A] ------------------> [Service B] ---------> [Service C]
  1. Client 发送刷新请求到 Service A
  2. Service A 通过消息中间件广播刷新事件。
  3. Service BService C 接收事件并执行配置刷新。

常用事件

  • RefreshRemoteApplicationEvent:触发配置刷新。
  • AckRemoteApplicationEvent:事件确认(用于调试和跟踪)。
  • Custom Event:用户自定义事件,用于分布式任务通知。

特点

  1. 解耦通信

    • 使用消息中间件实现服务间通信,无需直接调用其他服务的接口。
  2. 广播与分区

    • 默认情况下,事件会广播到所有服务。
    • 可以通过 destination 参数指定只刷新某些服务。
  3. 依赖 Spring Cloud Stream

    • Spring Cloud Bus 基于 Spring Cloud Stream,利用其抽象来屏蔽底层消息中间件的差异。

配置示例

1. 引入依赖

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

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

2. 配置消息中间件

1spring: 2 rabbitmq: 3 host: localhost 4 port: 5672 5 username: guest 6 password: guest

3. 启用 Actuator 和 Bus 刷新

1management: 2 endpoints: 3 web: 4 exposure: 5 include: bus-refresh

适用场景

  1. 配置刷新
    • 当配置中心的配置文件发生变化时,触发全局刷新。
  2. 分布式任务通知
    • 如任务调度、事件通知等。
  3. 自定义事件传播
    • 在微服务之间广播特定事件。

最近更新时间:2024-12-25