Spring Cloud Bus 和 Spring Cloud Stream 都是 Spring Cloud 生態中的消息通信組件,但它們的定位和使用場景有顯著區別:
1. Spring Cloud Bus
核心定位:分布式系統的消息廣播(配置刷新、事件傳播)。
典型場景:
- 通過消息中間件(如 RabbitMQ、Kafka)廣播配置變更事件,實現所有微服務配置的集中刷新(如結合
/actuator/refresh
或/actuator/bus-refresh
端點)。 - 跨服務的事件通知(例如:注銷全局緩存、批量觸發操作)。
關鍵特性:
- 基于 輕量級事件驅動(如
RefreshRemoteApplicationEvent
)。 - 依賴 Spring Cloud Config 實現配置的動態更新。
- 通常與
@RefreshScope
配合使用。
示例:
# 通過Bus廣播配置刷新指令
POST http://config-server/actuator/bus-refresh
2. Spring Cloud Stream
核心定位:簡化消息中間件的集成,提供統一的消息生產與消費模型。
典型場景:
- 構建事件驅動的微服務,如訂單創建觸發庫存扣減。
- 需要與 Kafka、RabbitMQ 等中間件交互的業務邏輯。
關鍵特性:
- 抽象 Binder 層,屏蔽底層中間件差異(如 Kafka/RabbitMQ)。
- 提供
@StreamListener
(舊版)或函數式編程模型(新版)處理消息。 - 支持消息分區、消費組、重試等高級特性。
示例:
// 生產者
@Bean
public Supplier<String> produce() {return () -> "Hello Stream";
}// 消費者
@Bean
public Consumer<String> consume() {return message -> System.out.println("Received: " + message);
}
主要區別
維度 | Spring Cloud Bus | Spring Cloud Stream |
---|---|---|
用途 | 系統級事件廣播(如配置刷新) | 業務級消息通信(如訂單事件) |
抽象層級 | 基于 Spring 事件機制 + 消息中間件廣播 | 統一的消息中間件編程模型 |
使用復雜度 | 簡單,主要依賴自動配置和端點觸發 | 較高,需定義消息通道和綁定邏輯 |
依賴關系 | 通常與 Spring Cloud Config 配合使用 | 獨立使用,直接處理業務消息流 |
典型中間件 | RabbitMQ、Kafka(僅用于傳輸事件) | Kafka、RabbitMQ、RocketMQ 等 |
協作場景
兩者可結合使用,例如:
- Config Server 通過 Bus 廣播配置變更。
- 微服務接收到配置更新事件后,通過 Stream 發送業務通知到其他系統。
總結:Bus 是系統管理的“廣播電臺”,Stream 是業務消息的“收發器”。