Version: Next

Stream 概述

消息中间件选型问题

  • 目前流行的消息队列:RockerMQRabbitMQKafkaActiveMQ
  • 全学了会裂开,此外,可能遇到使用不同 MQ 的项目对接的问题
  • Stream:屏蔽底层消息中间件差异,降低切换成本,统一消息的编程模型

Spring Cloud Stream

  • 是一个构件消息驱动微服务的框架
  • 应用程序通过 inputsoutputsSpring Cloud Stream 中的 Binder 对象交互
  • 通过配置来 绑定 binding,Spring Cloud Stream 的 Binder 对象负责与 消息中间件 交互
  • 开发者 只需要学会如何与 Stream 交互就可以方便使用消息驱动的方式,通过使用 Spring Integration 来连接消息代理中间件以实现消息时间驱动
  • Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,引用了 发布-订阅消费组分区 三个核心概念
  • 目前仅支持 RabbitMQKafka

Stream 设计思想

标准MQ

  • 生产者、消费者之间依靠 消息 没接传递消息信息 Message
  • 消息必须走特定的 通道 Message Channel
  • 消息通道的消息如何被消费——谁负责 收发处理
    • 消息通道 MessageChannel 的子接口 SubscribableChannel,由 MessageHandler 消息处理器订阅

引入 Spring Cloud

  • 具体的消息中间件选型与业务系统耦合,引入 Spring Cloud 后,Stream 提供了一种 解耦 方式
  • 通过 绑定器 Binder 作为中间层,实现应用程序与消息中间件细节之间的隔离
  • 通过向应用程序暴露统一的 Channel 通道,使得应用程序不需要考虑各种不同的消息中间件实现

绑定器 Binder

可以做到代码层面对消息中间件的无感知,甚至能基于动态的中间件切换,使微服务开发高度解耦,服务可以更多关注自己的业务流程

  • Stream 中的消息通信方式遵循了 发布-订阅 模式,Topic 主题进行广播
    • RabbitMQ:就是 Exchange
    • Kafa:就是 Topic

Stream 业务流程与常用注解

  • Binder方便的连接消息中间件,屏蔽差异
  • Channel通道,是队列 Queue 的一种抽象,在消息通信系统中就是实现存储与转发的媒介,通过 Channel 对队列进行配置
  • Source & Sink可简单理解为 Stream 自身,从 Stream 发布消息就是输出,接收消息就是输入

常用注解

注解解释
@Input注解标识输入通道,通过该输入通道接收到的消息进入应用程序
@Output注解标识输出通道,发布的消息将通过该通道离开应用程序
@StreamListener监听队列,用于消费者队列消息接收
@EnableBinding指通道 channelExchange / Topic 绑定在一起