展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

Stream

目前市场上有多种消息中间件,如果要全部掌握会比较苦难,使用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则不能接收,说明分组可持久化消息
posted @ 2022-07-27 11:55  DogLeftover  阅读(80)  评论(0编辑  收藏  举报