SpringCloud 整合RabbitMQ

 简介:Spring Cloud Stream是一个构建消息驱动的微服务框架,应用程序通过input通道或者output通道来与Spring Cloud Stream中binder交互,通过配置来binding,而binder负责与消息中间件交互。Spring Cloud Stream是为了简化开发人员对消息中间件的使用复杂度,让我们有更多精力关注核心业务逻辑的处理。

1. Maven依赖

<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(消息驱动)

      Spring Cloud中文文档

      配置参数详解

      Spring Cloud Stream进阶配置高吞吐量之批量预期消息prefetch

 

posted @ 2020-05-24 21:35  如幻行云  阅读(1785)  评论(0编辑  收藏  举报