springCloudStream
简介
Spring Cloud Stream
是一个框架,用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。
该框架提供了一个灵活的编程模型,该模型建立在已经建立和熟悉的 Spring 习惯用语和最佳实践之上,包括对持久发布/订阅语义、消费者组和有状态分区的支持。
核心模块
- Destination Binders: 负责提供与外部消息系统集成的组件
- Destination Bindings: 外部消息系统和用户程序代码之间的桥梁(生产者-使用者之间的桥梁)
- Message:生产者和消费者用于与Destination Binders(以及通过外部消息系统与其他应用程序)通信的规范数据结构。
历史
Spring 的数据集成之旅始于 Spring Integration。通过其编程模型,它提供了一致的开发人员体验来构建应用程序,这些应用程序可以采用企业集成模式来连接外部系统,例如数据库、消息代理等。
快进到云时代,微服务在企业环境中变得突出。Spring Boot 改变了开发人员构建应用程序的方式。借助 Spring 的编程模型和 Spring Boot 处理的运行时职责,可以无缝开发独立的、基于 Spring 的生产级微服务。
为了将其扩展到数据集成工作负载,Spring Integration 和 Spring Boot 被放在一个新项目中。Spring Cloud Stream 诞生了。
架构模型
这张图是spring-stream官网的,里面的Middleware
指的就是RabbitMQ
或者KafKa
这些消息队列。
下图是我们原来和消息队列通信的方式。我们的程序直接发送数据给MQ或者监听到MQ的数据。
通过spring stream
来做的话,就增加了Binder
层来做统一调度,我们的程序只需要和Binder层通信,不需要关注底层的MQ是RabbitMQ
还是Kafka
。
目前官方提供了两个Binder
,分别是RabbitMQ
的和Kafka
的,其余队列的有一些第三方维护的。同时我们也可以自己实现Binder
。
一开始图中的Input
和Output
是对于spring stream
来说的,input就是输入消息到stream中,output就是输出消息到我们的程序中。
简单介绍一下Binder,其实就是策略模式
,统一接口实现,比如MQ1里面发送消息到MQ的方法叫Publish
,MQ2里面发送消息到MQ的方法叫Release
,但是在Binder接口里面提供了一个方法,就叫做add
。也只需要提供一个Message消息。
public interface Binder{
function add(Message msg);
}
// 连接MQ1的Binder
public class Binder1 implements Binder{
public function add(Message msg){
// 消息处理
// 发送到MQ1
publish(msg);
}
}
// 连接MQ2的Binder
public class Binder2 implements Binder{
public function add(Message msg){
// 消息处理
// 发送到MQ2
release(msg);
}
}
当我们使用的时候只需要自己决定使用哪个Binder就可以了。就是就和连接数据库一样,不需要关心连接的是Mysql还是PostgreSql。
public class main{
public static function main() {
Binder binder = new Binder1();
Message msg = new Message();
binder.add(msg);
}
}
Bindings
Bindings作为一个桥梁,负责连接MQ和用户代码。比如绑定一个代码作为input往某一个Queue里面输入信息,绑定一个代码作为output从某个Queue里面接收信息。然后我们使用Binder来实现推送消息到MQ和消费消息。
这里是官网原文:The application communicates with the outside world by establishing bindings between destinations exposed by the external brokers and input/output arguments in your code. Broker specific details necessary to establish bindings are handled by middleware-specific Binder implementations.
下图为Bindings和Binder的关系
source 和 sink
source其实就是发送方的发送的Message. sink就是接收方接受的Message
注解实现
注解的实现已经被彻底删除,只有之前低版本的还能使用
函数式编程实现示例
依赖引入
将下面的代码加入pom
文件,然后使用maven
导入相关依赖即可。
// 引入spring cloud stream依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
// 引入spring cloud stream的rabbit binder依赖
// 如果是kafka,那么把这个换成kafka的binder
// 在这个binder里面已经引入了 rabbit MQ依赖,所以不需要再单独引入rabbit MQ了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
配置文件
server:
port: 8801
spring:
application:
name: cloud