spring-cloud-stream-reactive是spring-cloud-stream发布订阅消息驱动的响应式编程组件。提供异步非阻塞消息发布订阅。
下面是一大坨说明=-=
通过output输出管道 和 input输入管道来发布和订阅消息,spring-cloud-stream的binder负责将管道适配到指定的消息中间件,并负责与消息中间件交互(相当于在管道和消息中间件之间加了一层缓冲,可以使上层不需要关注底层中间件的差异, 中间件的变动只需要替换binder即可,业务代码不需要任何改动)。此外需要借助spring-integration来连接消息代理中间件以实现消息事件驱动,目前提供rabbitMq和kafka两个消息中间件的binder实现,只需引入就会自动绑定。主要有发布-订阅、消费组、分区的三个核心概念。
发布-订阅:由生产者发布消息到队列或者某个管道或者消息中间件,消费者从指定队列或者管道消费处理消息
消费组:当同一个消费者程序,启动多个同时消费相同的队列或者消息组件中的消息时,会存在重复消费,消费组就是将同一个消费者的多个实例配置到相同的组,达到同一组内只有一个消费者会消费到同一个消息达到避免重复消费的问题。
消费分区:当设置了消费组之后,在某些场景下,需要让消息内容中包含某个数据的消息发到同一个实例上消费,而不是被随机的某个实例消费到(类似Nginx的ip hash,同一个客户端的请求发到固定的一个后端服务上),此时可以通过消费分区,通过为消费者配置开启分区,生产者配置分区key表达式来实现。(此消费分区是由spring-cloud-stream实现的应用层消费分区,所以对于不支持消费分区的消息中间件也是可以实现消费分区的)
个人理解,有误需打脸纠正?
下面是一个spring-cloud-stream-reactive响应式发布订阅的例子:相关注解使用请查资料
主要依赖:spring-cloud版本 Greenwich.RELEASE。
//spring-cloud-stream 自动绑定rabbitmq的依赖
implementation 'org.springframework.cloud:spring-cloud-starter-stream-rabbit'
//reactive响应式编程
implementation "org.springframework.cloud:spring-cloud-stream-reactive"
//lombok idea(settings->compiler->enable annotation processor
annotationProcessor 'org.projectlombok:lombok'
compileOnly "org.projectlombok:lombok"
生产者:
package tom.spring.cloud.stream.reactive.sender;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.reactive.FluxSender;
import org.springframework.cloud.stream.r