9. Spring Cloud StreamとRabbitMQの統合の概要

Spring Cloud StreamとRabbitMQの統合を紹介する

序文

Spring Cloud Streamは、Spring BootおよびSpring Integrationに基づいて構築されたフレームワークであり、イベント駆動型またはメッセージ駆動型のマイクロサービスの作成に役立ちます。この記事では、いくつかの簡単な例を通して、Spring Cloud Streamの概念と構造を紹介します。

  • バインディング—入力および出力チャネルを宣言するインターフェースのコレクション。
  • バインダー— KafkaやRabbitMQなどのメッセージミドルウェアの実装
  • チャネル—メッセージミドルウェアとアプリケーション間の通信チャネルを表します
  • StreamListeners — Beanのメッセージ処理メソッドミドルウェアのMessageConverter固有のイベントでオブジェクトのシリアル化/逆シリアル化が実行された後、メッセージ処理メソッドはチャネル上のメッセージで自動的に呼び出されます。
  • メッセージスキーマ-メッセージのシリアル化および逆シリアル化に使用されます。これらのスキーマは静的または動的に読み込むことができ、オブジェクトタイプの進化をサポートします。

信頼する:

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-stream-rabbit'

生産終了:

1.フル

spring:
  application:
    name: rabbitmq-springcloudstream-producer
  cloud:
    stream:
      instanceCount: 3
      bindings:
        output_channel:       #输出 生产者
          group: queue-1  #指定相同的exchange-1和不同的queue 表示广播模式 #指定相同的exchange和相同的queue表示集群负载均衡模式
          destination: exchange-1 # kafka:发布订阅模型里面的topic rabbitmq: exchange的概念(但是exchange的类型那里设置呢?)
          binder: local_rabbit
      binders:
        local_rabbit:
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: 10.0.0.22
                port: 5672
                username: xiefei
                password: xiefei
                virtual-host: /

2.バリスタ

/**
 * 这里的Barista接口是定义来作为后面类的参数,这一接口定义来通道类型和通道名称。
 * 通道名称是作为配置用,通道类型则决定了app会使用这一通道进行发送消息还是从中接收消息。
 *
 * @author: 谢飞
 */
public interface Barista {
    
    
    String INPUT_CHANNEL = "input_channel";
    String OUTPUT_CHANNEL = "output_channel";


    //注解@Input声明了它是一个输入类型的通道,名字是Barista.INPUT_CHANNEL,也就是position3的input_channel。这一名字与上述配置app2的配置文件中position1应该一致,表明注入了一个名字叫做input_channel的通道,它的类型是input,订阅的主题是position2处声明的mydest这个主题
    @Input(Barista.INPUT_CHANNEL)
    SubscribableChannel loginput();

    //注解@Output声明了它是一个输出类型的通道,名字是output_channel。这一名字与app1中通道名一致,表明注入了一个名字为output_channel的通道,类型是output,发布的主题名为mydest。
    @Output(Barista.OUTPUT_CHANNEL)
    MessageChannel logoutput();
}

3.RabbitmqSender


/**
 * @author: 谢飞
 */
@Service
public class RabbitmqSender {
    
    

    @Autowired
    private Barista source;

    // 发送消息
    public String sendMessage(Object message){
    
    
        try{
    
    
            source.logoutput().send(MessageBuilder.withPayload(message).build());
            System.out.println("发送数据:" + message);
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
        return null;
    }
}

4.申し込み

/**
 * @author 谢飞
 */
@SpringBootApplication
@EnableBinding(Barista.class)
public class ProducerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ProducerApplication.class, args);
    }

}

5.テスト

/**
 * @author: 谢飞
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestRabbitMQ {
    
    

    @Autowired
    private RabbitmqSender rabbitmqSender;

    /**
     * 发送到集群队列
     */
    @Test
    public void sendHelloQueue() {
    
    
        rabbitmqSender.sendMessage("这是发送的消息");
    }

}

消費者側

1.フル

spring:
  application:
    name: rabbitmq-springcloudstream-consumer
  cloud:
    stream:
      instanceCount: 3
      bindings:
        input_channel:       #输出 生产者
          destination: exchange-1 # kafka:发布订阅模型里面的topic rabbitmq: exchange的概念(但是exchange的类型那里设置呢?)
          group: queue-1  #指定相同的exchange-1和不同的queue 表示广播模式 #指定相同的exchange和相同的queue表示集群负载均衡模式
          binder: rabbit_local
          consumer:
            concurrency: 1
      rabbit:
        bindings:
          input_channel:
            consumer:
              transacted: true
              txSize: 10
              acknowledgeMode: MANUAL
              durableSubscription: true
              maxConcurrency: 20
              recoveryInterval: 3000
      binders:
        rabbit_local:
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: 10.0.0.22
                port: 5672
                username: xiefei
                password: xiefei
                virtual-host: /

2.バリスタ

/**
 * 这里的Barista接口是定义来作为后面类的参数,这一接口定义来通道类型和通道名称。
 * 通道名称是作为配置用,通道类型则决定了app会使用这一通道进行发送消息还是从中接收消息。
 *
 * @author: 谢飞
 */
public interface Barista {
    
    
    String INPUT_CHANNEL = "input_channel";
    String OUTPUT_CHANNEL = "output_channel";


    //注解@Input声明了它是一个输入类型的通道,名字是Barista.INPUT_CHANNEL,也就是position3的input_channel。这一名字与上述配置app2的配置文件中position1应该一致,表明注入了一个名字叫做input_channel的通道,它的类型是input,订阅的主题是position2处声明的mydest这个主题
    @Input(Barista.INPUT_CHANNEL)
    SubscribableChannel loginput();

    //注解@Output声明了它是一个输出类型的通道,名字是output_channel。这一名字与app1中通道名一致,表明注入了一个名字为output_channel的通道,类型是output,发布的主题名为mydest。
    @Output(Barista.OUTPUT_CHANNEL)
    MessageChannel logoutput();
}

3.RabbitmqReceiver

/**
 * @author: 谢飞
 */
@EnableBinding(Barista.class)
@Service
public class RabbitmqReceiver {
    
    

    @StreamListener(Barista.INPUT_CHANNEL)
    public void receiver(Message message) {
    
    
        //广播通道
        //PublishSubscribeChannel psc = new PublishSubscribeChannel();
        //确认通道
        //RendezvousChannel rc = new RendezvousChannel();
        Channel channel = (com.rabbitmq.client.Channel) message.getHeaders().get(AmqpHeaders.CHANNEL);
        Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG);
        System.out.println("Input Stream 1 接受数据:" + message);
        try {
    
    
            channel.basicAck(deliveryTag, false);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

概要:上記は、RabbitMQを統合するSpring Cloud Streamの単純なアプリケーションであり、コードが多すぎます。

コードアドレス:https://gitee.com/zoo-plus/springboot-learn/tree/2.x/springboot-middleware

おすすめ

転載: blog.csdn.net/qq_36850813/article/details/104294805