目前市场上有多种消息中间件,如果要全部掌握会比较苦难,使用Cloud Stream则可以屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型
目前Stream仅支持RabbitMQ、Kafka
消息提供者方使用Stream的Source创建通道Output传递message到RabbitMQ
RabbitMQ接收并存储message
消息消费者方使用Stream的Sink创建通道Input接收RabbitMQ传递过来的message
rabbitmq环境已搭建好,新建cloud-stream-rabbitmq-provider8801,作为消息提供者
pom中拉取stream-rabbit依赖,yml中配置端口、服务名、rabbitmq配置、消息通道配置、eureka配置,启动类
编写业务类:定义消息通道output,通过消息通道将message发送到rabbitmq
测试:启动eureka模块、提供者模块、rabbitmq服务,提供者发送的message会在rabbitmq接收后显示
新建cloud-stream-rabbitmq-consumer8802,作为消费者接受模块,拉取依赖,yml配置除了消息通道配置其他和8801一致,启动类配置
编写业务:编写一个监听类,监听接收到的消息
测试:提供者模块8801发送的消息可被消费者模块8802接收
新建cloud-stream-rabbitmq-consumer8803,作为消费者接受模块;这时8801发送消息时,8802和8803都会接收到相同的消息
8802和8803若是一个集群,8802、8803应该是同一个group(组),消息应该只能被其中一个消费者模块接收一次;如果是不同的组,则都可以接收到消息;目前两个消费者模块都能接收消息,是因为两个模块被认为是不同的组
为消费者模块分组,在消费者模块的yml中配置如下:
bindings: #服务的整合处理
input: #这个名字是一个通道的名称
destination: studyExchange #表示要使用的exchange名称定义
content-type: application/json #设置消息类型,本次为json
binder: defaultRabbit #设置要绑定的消息服务的具体设置
group: atguiguA # 分组名称
若8802设置成A组,8803设置为B组,这时是不同的组,依然会存在重复消费,若都设置成A组,则可避免重复消费
消费者模块8802设置A组,8803不设置组,提供者模块8801发送消息后,8802、8803启动,这时8802可接收到消息,8803则不能接收,说明分组可持久化消息