一、产生背景
现在被广泛使用的消息中间件有ActiveMQ、RabbitMQ、RocketMQ、Kafka。这些中间件的差异性导致我们在实际项目开发中会遇到诸多问题。譬如,最开始我们使用其中一种消息中间件,后面因业务要求需要往另一种消息中间件迁移,这对开发人员来说无疑是个头疼的问题,一大堆东西都要推倒重做。Stream屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型,有效解决了上述问题
二、Spring Cloud Stream介绍
官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架
应用程序通过 inputs 或着 outputs 来与 Spring Cloud Stream 中 binder对象 交互。通过我们配置来binding(绑定),而 Spring Cloud Stream 的binder对象负责与消息中间件交互。所以,我们只需要搞清楚如何与 Spring Cloud Stream 交互就可以方便使用消息驱动的方式
通过使用 Spring Integration 来连接消息代理中间件以实现消息事件驱动。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,引用了发布-订阅、消费组、分区的三个核心概念
目前仅支持 RabbitMQ、Kafka
三、设计思想
3.1 标准MQ
- 生产者/消费者之间靠 消息媒介 传递信息内容(Message)
- 消息必须走特定的 通道(消息通道 MessageChannel)
- 消息通道里的消息如何被消费?谁负责收发处理(消息通道MessageChannel的子接口SubscribableChannel,由MessageHandler消息处理器所订阅)
3.2 Binder
Stream为什么可以统一底层差异呢?
在没有绑定器(Binder)这个概念的情况下,我们的SpringBoot应用要直接与消息中间件进行信息交互的时候,由于各个消息中间件构建的初衷不同,他们的实现细节上会有较大的差异性。通过定义绑定器作为中间层,完美地实现了应用程序与消息中间件细节之间的隔离。通过向应用程序暴露统一的Channel通道,使得应用程序不需要再考虑各种不同的消息中间件实现
Binder中,input对应于消费者、output对应于生产者。Binder可以做到代码层面对中间件的无感知,甚至于动态的切换中间件(例如:rabbitmq切换成kafka),使得微服务开发的高度解耦,服务可以关注更多自己的业务流程
3.3 Stream的消息通信方式
Stream的消息通信方式遵循了 “发布-订阅模式”。使用Topic主题进行广播(在RabbitMQ中就是Exchange;在kafka中就是Topic)