Spring Cloud Stream

149 阅读2分钟

官方对Spring Cloud Stream(简称SCS)的定义是:一个为与消息中间件连接的微服务构建事件驱动的框架。

SCS在Spring Integration项目的基础上在进行了一些封装,并提出一些新的概念,让开发者能够更简单地使用这套消息编程模型。

理解Binder和Binding

  • Binder用于绑定一个对象(app interface)到一个逻辑名字(logical name)上。

    • 名字用来识别消息的消费者或生产者。
    • 被绑定的对象可以是一个队列、一个ChannelAdapter、一个MessageChannel或者一个Spring Bean
public interface Binder<T, C extends ConsumerProperties, P extends ProducerProperties> {

 Binding<T> bindConsumer(String name, String group, T inboundBindTarget,
       C consumerProperties);

 Binding<T> bindProducer(String name, T outboundBindTarget, P producerProperties);
}

Binder接口对外暴露两个方法,分别是bindConsumerbindProducer

  • Binding是应用与消息中间件之间的桥梁,由Binder构造。

    • Producer Binding(Out Binding):应用发出的消息(output)和消费中间件之间的桥梁。

    • Consumer Binding(Input Binding):消息中间件和应用对消息处理(iutput)之间的桥梁。

消息的发送

source.output().send(MessageBuilder
                    .withPayload("custompayload")
                    .setHeader("k1", "v1")
                    .build()); 
  1. 发送的是Spring Message,为何到KafkaRabbitMQRocketMQ中却变成了这些消息中间件的消息模型?
  2. 发送到MessageChannel中的消息,存储到MessageChannel也表示储存到内存中。为何最终变成了存储到消息中间件中?

Spring Cloud Stream 消息发送过程

这两个行为会在Producer Binding中完成。

  1. 首先会通过SendingHandler这个MessageHandler去订阅消息发送的MessageChannel

  2. SendingHandler内部会根据配置信息决定是否使用固定的消息头对消息体进行修改;

  3. 然后把处理完的消息委托给Binder构造的MessageHandler继续处理。

    1. Spring Message转换成对应MQ的Message Model
    2. 转换后的Message Model发送到MQ broker

Binder是一个接口,不同实现类会构造不一样的MessageHandlerKafkaBinder构造KafkaProducerMessageHandler; RabbitMQ Binder构造AmqpOutboundEndpointRocketMQ Binder 构造 RocketMQMessageHandler

消息的接收

    @StreamListener(Sink.INPUT) 
    public String receive(String msg){
        return msg.toUpperCase();
    }
  1. 订阅的明明是消息中间件Message Model,为何收到的只是一个String
  2. 消息中间件的订阅方式不一样,为何这里可以统一用@StreamListener进行订阅?

Spring Cloud Stream 消息接收过程

这两个行为在Consumer Binding中完成。

  1. 首先会根据Binder得到ChannelAdapter

    不同的Binder 构造不一样的ChannelAdapter,比如Kafka Binder构造KafkaMessageDrivenChannelAdapterRabbitMQ Binder构造AmqpInboundChannelAdapterRocketMQ Binder构造RocketMQInboundChannelAdapter

  2. 利用ChannelAdapter读取消息中间件上的消息,再把这些消息转换成Spring Message

  3. 最后发送到MessageChannel中;

  4. 之后通过@StreamListener注解读取这个MessageChannel上的消息。

@StreamListener注解底层实际上是构造了一个MessageHandler,用MessageHandler去订阅MessageChannel上的注解。 同样,其他像@ServiceActivator@Transformer@Filter等注解底层也会构造MessageHandler,去订阅MessageChannel上的消息。