spring cloud + rabbitmq使用经验
背景
最近新公司使用spring cloud的方式使用rabbitmq,因为之前没有使用过spring cloud,并且没用到rabbitmq的stream的使用方式,所以,现在写一个总结.
消息分组
消息分组参考https://blog.csdn.net/mameng1988/article/details/83902018
消息分组是为了解决多个消费者同时消费一条消息的场景.设置了消费组后,一个消息只会在组内的一个节点消费而不会发送到消费节点,实现也是非常的简单,只要在消费者中配置spring.cloud.stream.bindings.{channel-name}.group属性即可
生产者application.yml配置
server:
port: 8089
spring:
cloud:
stream:
binders:
defaultRabbit:
type: rabbit
environment: #配置rabbimq连接环境
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
username: mazhen
password: mazhen
virtual-host: /
bindings:
output: #生产者绑定,这个是消息通道的名称
destination: exchange-msg #exchange名称,交换模式默认是topic;把SpringCloud stream的消息输出通道绑定到RabbitMQ的exchange-msg交换器。
content-type: application/json
配置了spring.cloud.stream.bindings.output.destination=exchange-msg 后会在RabbitMQ 中创建一个名为 exchange-msg 交换器(exchange-msg)。spring.cloud.stream.bindings.output.destination=exchange-msg 的意思是把 spring cloud stream 的消息输出通道绑定到 RabbitMQ 的 exchange-msg 交换器。
消费者application.yml配置
server:
port: 8090
spring:
cloud:
stream:
binders:
defaultRabbit:
type: rabbit
environment: #配置rabbimq连接环境
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
username: xxx
password: xxx
virtual-host: /
bindings:
input: #生产者绑定,这个是消息通道的名称(是@StreamListener的value属性值)
group: group-A #该项目节点为消息组group-A的一个消费端
destination: exchange-msg #exchange名称,交换模式默认是topic;把SpringCloud stream的消息输入通道绑定到RabbitMQ的exchange-msg交换器。
content-type: application/json
配置了 spring.cloud.stream.bindings.input.destination=exchange-msg 后会在RabbitMQ 中创建一个名为 exchange-msg 交换器(exchange-msg)。spring.cloud.stream.bindings.input.destination=exchange-msg 的意思是把 spring cloud stream 的输入通道绑定到 RabbitMQ 的 exchange-msg 交换器。这样工程节点 StreamConsumer0 的输入通道对应节点 StreamProvider 的输出通道,StreamConsumer0 节点就配置成了 StreamProvider 节点的消费端。spring.cloud.stream.bindings.input.group=group-A 配置 StreamConsumer0 为消息组 group-A 中的一个消费端。这两个配置项联合起来解释,就是把节点 StreamConsumer0 的输入通道绑定到 RabbitMQ 的 exchange-msg 交换器,并设置为 exchange-msg 交换器中 group-A 消息消费组中的消费端节点。