前言
Spring Cloud Stream消息驱动组件是 Spring Cloud 中组件之一,通常用来帮助我们更快速的,更方便,更友好,优雅的方式去构建消息驱动微服务。
为什么不直接使用消息队列如ActiveMQ RabbitMQ RocketMQ Kafka等。
而是使用Spring Cloud Stream,它有什么优点,解决了什么样的问题?
Stream解决问题
首先对MQ中间件来说,有很多产品,其中包括ActiveMQ RabbitMQ RocketMQ Kafka等,MQ消息中间件⼴泛应⽤在应⽤解耦合、异步消息处理、流量削峰等场景中。
不同的MQ消息中间件内部机制包括使⽤⽅式都会有所不同,⽐如RabbitMQ中有Exchange(交换机/交换器).
kafka有Topic、Partition分区这些概念,MQ消息中间件之间的差异性不利于我们上层的开发应⽤。如果我们有需要从一个MQ切换到另一个MQ,那对应我们的程序代码也需要进行修改,此时MQ和程序耦合起来了。
此时,Stream就解决了这个问题,底层可以任意切换MQ,目前Stream仅支持RocketMQ 和 Kafka两款MQ产品。
Spring Cloud Stream进⾏了很好的上层抽象、屏蔽掉了底层具体MQ消息中间件的细节差异,就像Hibernate屏蔽掉了具体数
据库(Mysql/Oracle⼀样)。
Stream重要概念
Spring Cloud Stream 是⼀个构建消息驱动微服务的框架。应⽤程序通过inputs(相当于消息消费者consumer)或者outputs(相当于消息⽣产者producer)来与Spring Cloud Stream中的binder对象交互,⽽Binder对象是⽤来屏蔽底层MQ细节的,它负责与具体的消息中间件交互。
Application core: 消费者逻辑代码,生产者逻辑代码
MiddleWare : 对应底层中间件MQ
inputs: 可以用多个input 、关联消费者 输入 相对于程序代码来说 从Mq输入到消费者进行消费。
outputs: 可以用多个output、关联生产者 输出 相对于应用程序来说,从程序输出到mq中。
通道(Binddings): 通道用来跟Binder打交道
Binder: 绑定器对象,用来和底层MQ打交道
传统MQ模型与Stream消息驱动模型
Binder绑定器
Binder绑定器是Spring Cloud Stream 中⾮常核⼼的概念,就是通过它来屏蔽底层不同MQ消息中间件的细节差异,当需要更换为其他消息中间件时,我们需要做的就是更换对应的Binder绑定器⽽不需要修改任何应⽤逻辑(Binder绑定器的实现是框架内置的,Spring Cloud Stream⽬前⽀持Rabbit、Kafka两种消息队列)
Stream消息通信⽅式
Stream中的消息通信⽅式遵循了发布—订阅模式。
在Spring Cloud Stream中的消息通信⽅式遵循了发布-订阅模式,当⼀条消息被投递到消息中间件之 后,它会通过共享的 Topic 主题进⾏⼴播,消息消费者在订阅的