Spring 家族中三大消息处理相关框架关系图
一.Spring Messaging
Spring Messaging 是 Spring 框架中的一个底层模块,用于提供统一的消息编程模型。消息抽象了一个接口来定义如下:
public interface Message<T> {
//消息体
T getPayload();
//消息头
MessageHeaders getHeaders();
}
而消息是要塞入到消息通道里面才能发送出去的,所以抽象出了一个MessageChannel其中的send()方法就是为我们来发送消息到通道(实质是队列的一种抽象和封装,队列并没有暴露给业务层)
public interface MessageChannel {
long INDEFINITE_TIMEOUT = -1;
default boolean send(Message<?> message) {
return send(message, INDEFINITE_TIMEOUT);
}
boolean send(Message<?> message, long timeout);
}
支持轮询的 PollableChannel 和实现发布-订阅模式的 SubscribableChannel继承至MessageChannel
//轮询主动获取消息
public interface PollableChannel extends MessageChannel {
Message<?> receive();
Message<?> receive(long timeout);
}
//发布-订阅通过回调MessageHandler实现
public interface SubscribableChannel extends MessageChannel {
boolean subscribe(MessageHandler handler);
boolean unsubscribe(MessageHandler handler);
}
二.Spring Cloud Stream 基本架构
四个核心组件,分别是 Binder、Channel、Source 和 Sink,其中 Binder 和 Channel 成对出现,而 Source 和 Sink 分别面向消息的发布者和消费者。消息中间件这里默认集成了Kafka和RabbitMQ;
Source 和 Sink
public interface Source {
String OUTPUT = "output";
@Output(Source.OUTPUT)
MessageChannel output();
}
Source组件是真正生成消息的组件相当于output组件,Sink组件是消费消息的组件,相当于input组件。
source组件会使用一个pojo实体来封装消息对象,然后序列号后发送到管道Channel里面,Sink通过一定的配置(yml文件配合配置类)和监听,当监听到管道中有消息可以消费,获取消息再反系列化成pojo实体类,业务代码就可以来处理逻辑了。
Channel
Channel 就是一个通道,实质是队列的一个抽象和封装。消息生成者将消息发送至这个通道,消息消费者从此通道拉取消息消费。
Binder
对于 Spring Cloud Stream 而言,最核心的无疑是 Binder 组件。顾名思义是粘合剂,将业务和消息传递粘合在一起。Binder是应用和消息之间的一种抽象。集成不同的消息中间(Kafka和RabbitMQ)件进行整合。