次の関連プロジェクト構成については、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();
}
}
注:@EnableBindingとMessageChannelは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);
}
}
注:@EnableBindingとMessageChannelは、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送信者によって送信されたメッセージを自動的に消費します。メッセージを永続的にします。
証明:グループを構成する必要があります