SpringCloud 整合RabbitMQ
简介:Spring Cloud Stream是一个构建消息驱动的微服务框架,应用程序通过input通道或者output通道来与Spring Cloud Stream中binder交互,通过配置来binding,而binder负责与消息中间件交互。Spring Cloud Stream是为了简化开发人员对消息中间件的使用复杂度,让我们有更多精力关注核心业务逻辑的处理。
1. Maven依赖
1 2 3 4 5 | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> <version> 2.0 . 1 .RELEASE</version> </dependency> |
2. application.yml配置文件
spring: cloud: stream: rabbit: bindings: input-stream-test: consumer: acknowledge-mode: manual recovery-interval: 3000 #rabbitmq重连错误 input-stream: consumer: acknowledge-mode: manual recovery-interval: 3000 # 声明为延迟交换机 delayedExchange: true output: producer: delayedExchange: true binders: # 定义消息中间件的服务信息 rabbitmqc: # 表示定义的名称,用于bindings整合 type: rabbit # 消息组件类型 environment: spring: rabbitmq: host: rabbitmq port: 5672 username: admin password: admin virtual-host: / bindings: # 服务整合处理 myInput: # 通道名称
binder: rabbitmqc # 交换机名称 destination: a # 指定该应用实例属于哪个消费组 group: b consumer: # 开启消费者分区功能 partitioned: true myOutput: binder: rabbitmqc destination: a # 消息发送的格式 content-type: text/plain producer: # 指定分区键的表达式规则 partitionKeyExpression: payload partitionCount: 2 # 指定当前消费者的总实例数量 instance-count: 2 # 设置当前实例的索引号 instance-index: 0
3. 注解
A. @EnableBinding:将一个或多个接口作为参数,接口声明输入和输出通道,Stream提供了Source、Sink和Processor接口,也可以自定义接口;
B. @Input:标识一个输入通道,接收到的消息通过该输入通道进入应用程序;
C. @Output:标识一个输出通道,已发布的消息通过该输出通道离开应用程序,如果未提供名称,则使用方法的名称;
D. @StreamListener:基于内容的路由,方法的参数可以用@Payload、@Header、@Headers进行注释,若是有返回值,必须使用@SendTo注解为该方法返回的数据指定输出绑定目标。
4. 发布订阅模式
Stream中消息通讯方式遵守了发布订阅模式,当一条消息被投递出去时,它通过共享的Topic主题进行广播,消息消费者在订阅的主题中接收到它时,就会触发自身的逻辑进行处理。
5. 消费组(Consumer Groups)
通常在生产环境,我们的服务会以集群方式部署,目的是保证高可用和负载均衡,那么服务就会以多个实例运行着,而这些实例都会绑定到同一个消息通道的目标主题上。默认情况下,当生产者发出一条消息到绑定通道上,这条消息会产生多个副本被每个消费者实例接收和处理。但是有时候我们希望消息只被一个消费者消费,那么就需要用到消费组,只需要在服务消费端设置group属性即可,达到避免重复消费。同一组内,消费者会为生产者提供的消息发生竞争关系,只有其中一个实例可以消费。
spring.cloud.stream.bindings.<channelName>.group=组名
6. 延迟队列
延迟队列操作的对象是延迟消息,所谓延迟消息是指当消息被发送出去后,并不想让消费者立马消费,而是等待特定时间后,消费者才能拿到消息进行消费,使用场景有:支付订单、设备升级的超时处理,可以替代定时调度处理。
spring.cloud.stream.rabbit.bindings.<channelName>.producer.delayed-exchange=true # 延迟队列
channel.output().send(MessageBuilder.withPayload(message).setHeader("x-delay", 30 * 60 * 1000).build());
7. 消息分区
分区就是将数据分区,生产者生产的消息给多个消费者实例发送消息确保相同特征的数据被同一消费者实例处理。
8. 消费者类型
A. 消息驱动(异步):消息一旦可用,就会被传递,并且有现成可以处理它;
B. 轮询(同步):希望控制消息的处理速率。
9. 示例
Spring Cloud Stream进阶配置高吞吐量之批量预期消息prefetch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗