SpringCloud-Streamの構築と構成

次の関連プロジェクト構成については、giteeを確認してくださいhttps://gitee.com/xwb1056481167/spring-cloud

SpringCloudStreamとは何ですか

公式ウェブサイトでは、Spring CloudStreamをメッセージ駆動型マイクロサービスを構築するためのフレームワークとして定義しています。アプリケーションは入力と出力を介してSpringCloud Streamのバインダーオブジェクトと対話します。構成を通じて、Spring Cloud Streamのバインダーオブジェクトをバインド(バインド)します。メッセージミドルウェアとの対話を担当します。したがって、メッセージ駆動型アプローチを便利に使用するには、SpringCloudStreamと対話する方法を理解するだけで済みます。

なぜ紹介するのか

Spring Integrationを使用してメッセージブローカーミドルウェアを接続し、メッセージ駆動型のイベント駆動型を実現することで、Spring Cloud Streamは、一部のベンダーのメッセージミドルウェア製品にパーソナライズされた自動構成実装を提供し、3種類のパブリッシュ/サブスクライブ、コンシューマーグループ、およびパーティションを適用します。コアコンセプト。RabbitMQ、Kafka中国語ヘルプマニュアルのみをサポート

https://m.wang1314.com/doc/webapp/topic/20971999.html

springCloudStream標準プロセス

成分

説明

ミドルウェア

ミドルウェア、現在はRabbitMQ、Kafkaのみをサポートしています

バインダー

メッセージミドルウェア間のカプセル化にはバインダーが適用されます。現在、KafkaのバインダーとRabbitMQが実装されています。バインダーを介して、ミドルウェアを簡単にリンクし、メッセージタイプを動的に変更できます(KafkaのトピックとRabbitMQ)。これらはすべて構成ファイルを介して実現できます。

@入力

注釈は入力チャネルを示し、この入力チャネルを介して受信したメッセージはアプリケーションに入ります

@出力

公開されたメッセージがアプリケーションを離れるときの注釈出力チャネルを表します

@StreamListener

リスニングキューは、コンシューマーのキューのメッセージ受信に使用されます

@EnableBinding

チャネルチャネルを参照し、交換は一緒にバインドされます

消費者とプロバイダーの統合

メッセージプロバイダーcloud-stream-rabbitmq-provider8801

1、pom.xml

<!-- stream rabbitmq -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!-- 添加rabbitmq的支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.ymlのコア構成

spring:
  cloud:
    stream:
      binders: #在此处配合要绑定的rabbitmq的服务信息
        defaultRabbit: #表示定义的名称,用于binding整合
          type: rabbit #消息组件类型
          environment: #设置rabbitmq的相关环境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        output: #这个名字是一个通道的名字
          destination: studyExchange #表示要使用的Exchange你名称定义
          content-type: application/json #设置消息类型,本次为json,文本则为"text/plain"
          binder: defaultRabbit #设置要绑定的额消息服务的具体设置

3.メインのスタートアップクラス

@SpringBootApplication
@EnableDiscoveryClient
public class StreamMQMain8801 {
    public static void main(String[] args) {
        SpringApplication.run(StreamMQMain8801.class,args);
    }
}

4.コア構成の送信者

// 1、接口
public interface IMessageProvider {
    public String send();
}
//2、接口实现类
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.xwb.springcloud.service.IMessageProvider;
import javax.annotation.Resource;
import java.util.UUID;
/**
 * 定义消息的推送管道
 * 里面注入的内容都是message的,谨记不是注入dao、或其他什么,
 */
@EnableBinding(Source.class)
public class IMessageProviderImpl implements IMessageProvider {
    @Resource
    private MessageChannel output;
    @Override
    public String send() {
        String serial = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(serial).build());
        System.out.println("****************serial:"+serial);
        return serial;

    }
}
//3、controller发送
@RestController
public class SendMessageController {
    @Resource
    private IMessageProvider messageProvider;
    @GetMapping("/sendMessage")
    public String sendMessage() {
        return messageProvider.send();
    }
}

注:@EnableBindingMessageChannelはjarパッケージに導入されており、どちらもcloud.streamに依存しています。*

メッセージコンシューマー8802、8803

8002と8003の構成は同じですが、ポート番号のみが異なります。ここでは、8002.8003の構成が
新しいモジュールcloud-stream-rabbitmq-consumer8802と同じであることを意味します。

1、pom.xml

 <!-- stream rabbitmq -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!-- 添加rabbitmq的支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2、l配置

spring:
  cloud:
    stream:
      binders: #在此处配合要绑定的rabbitmq的服务信息
        defaultRabbit: #表示定义的名称,用于binding整合
          type: rabbit #消息组件类型
          environment: #设置rabbitmq的相关环境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        input: #这个名字是一个通道的名字
          destination: studyExchange #表示要使用的Exchange你名称定义
          content-type: application/json #设置消息类型,本次为json,文本则为"text/plain"
          binder: defaultRabbit #设置要绑定的额消息服务的具体设置

注:bindings.input。ここで、コンシューマーはチャネルからメッセージを取得し、それをシンクに入力して読み取る必要があります。
3.メインのスタートアップクラス

@SpringBootApplication
@EnableDiscoveryClient
public class StreamMQMain8802 {
    public static void main(String[] args) {
        SpringApplication.run(StreamMQMain8802.class, args);
    }
}

4.メッセージの受信と消費

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
    @Value("\${server.port}")
    private String serverPort;
    @StreamListener(Sink.INPUT)
    public void receiveMessage(@Payload String in, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) {
        System.out.println("消费者"+serverPort+"收到的消息为-->:"+in + " received from queue " + queue);
    }
}

注:@EnableBindingMessageChannelは、cloud.stream。*の依存関係であるjarパッケージに導入されています。8002
に従って8003プロジェクトを作成します。

テスト

7001、8801プロデューサー、8002、8003コンシューマーを開始し、アドレスバーにgetリクエストを入力してメッセージを送信します

http:// localhost:8801 / sendMessage

rabbitmqのピーク変化

8802および8803がメッセージ結果を受信しました

グループの消費と持続性

質問:8801によって送信されたメッセージは8802と8803によって消費されます。問題の解決方法
原則:マイクロサービスアプリケーションが同じグループに配置されている場合、メッセージはいずれかのアプリケーションによってのみ消費されることが保証されます。異なるグループはサブオルファイドになることができます
同じグループは競争関係にあり、そのうちの1つだけが消費できます。

グループ化

1.したがって、解決策はそれらを同じグループに入れることです

spring:
  application:
    name: cloud-stream-customer #服务名
  cloud:
    stream:
      binders: #在此处配合要绑定的rabbitmq的服务信息
        defaultRabbit: #表示定义的名称,用于binding整合
          type: rabbit #消息组件类型
          environment: #设置rabbitmq的相关环境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        input: #这个名字是一个通道的名字
          destination: studyExchange #表示要使用的Exchange你名称定义
          content-type: application/json #设置消息类型,本次为json,文本则为"text/plain"
          binder: defaultRabbit #设置要绑定的额消息服务的具体设置
          group: consumerA

同じグループに参加する:グループ:consumerAは繰り返しの消費を避けることができます

持久化

8802と8803の一方がグループ化で構成され、もう一方がキャンセルされた場合、グループ化で構成されたコンシューマーは、コンシューマーの再起動後に8801送信者によって送信されたメッセージを自動的に消費します。メッセージを永続的にします。
証明:グループを構成する必要があります

おすすめ

転載: blog.csdn.net/www1056481167/article/details/113605633