序文
1. SpringCloudStream統合
- 春の雲、ホット珍しい中小インターネット企業全体で、この家族のバケットフレームワークは、それに対応する春クラウドストリームは徐々に、誰もがそれに注意を払う春クラウドストリームは、RabbitMQのと統合する方法を説明するための主な教訓となります。
アーキテクチャの紹介
先バインダー:アプリケーションアプリケーションは、独自の残っているのRabbitMQが含まれている、右はカフカがあります。生産とは、メッセージ送信を示し、メッセージが異なるミドルウェアであってもよいです。これは、春のクラウドストリーム抽象の先頭です。非常に良い場所。
二つの重要な領域:入力(入力)メッセージ受信端末は、メッセージの出力(出力)の端部がスプリングクラウドストリームは、コア・メッセージング・ミドルウェアに適用される送信、アプリケーションスプリングクラウドストリームは、外部チャネルと通信する入力/出力チャネルを介して注入しました。バインダーは、外部のメッセージング・ミドルウェアと通信するために特定のチャネルを介して達成しました。
黄色:RabbitMQの表すグリーンプラグが異なるメッセージの様々な使用することができ、入力および出力プラグは、メッセージの層はプラグを設定され、メッセージミドルウェアを置き換えるために使用することができます。
コア概念は: Barista接口
:バリスタインタフェースはチャネルのこのタイプのチャンネル名のパラメータバッククラスインターフェース定義として定義され、チャンネル名が設定として使用され、チャネル・タイプは、このメッセージを使用するチャネルアプリから送信または受信される判定するメッセージ。
チャネルインタフェースを定義する方法:@Output
:メッセージを送信するためのインタフェースを定義する出力注釈@Input
メッセージコンシューマインタフェースを定義するため、注釈入力:@StreamListener
:注釈は、リスナーメソッドを定義するために
使用春クラウドストリームは、これらの3つのノートは、高性能のメッセージの生産と消費を達成するためにシーンに非常に適切なものとすることができるちょうど良い使用、非常にシンプルですが、SpringCloudStreamフレームワークを使用すると、彼らは配達の信頼性を得ることができないという非常に大きな問題がありますメッセージが保証されていない100%の信頼性は、メッセージ損失の問題の少量が存在するであろう。SpringCloudStreamの両方カフカのためのフレームワークとは、とても実用的な仕事でそれを使用する目的は、高性能のメッセージ通信を目的としているため、現在のRabbitMQとカフカのSpringCloudStream統合は、我々はすべてのカフカは、メッセージの信頼性を実現することができなかったことを知って、理由があります!この点はSpringCloudStreamの現在のバージョンに位置しています。したがって、実際の作業では、単独のRabbitMQを使用することができる送達の信頼性を確保する必要がある場合、それはまた可能であり、SpringCloudStreamを採用することができます。
2.コードを示してい
2.1生産終了
RabbitMQの-springcloudstreamプロデューサープロジェクトの作成2.1.1
1は、依存関係のpom.xmlが導入され、
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cp</groupId>
<artifactId>rabbitmq-springcloudstream-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rabbitmq-springcloudstream-producer</name>
<description>rabbitmq-spring</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
図2に示すように、インタフェースが定義されているバリスタ
/**
* 这里的Barista接口是定义来作为后面类的参数,这一接口定义来通道类型和通道名称。
* 通道名称是作为配置用,通道类型则决定了app会使用这一通道进行发送消息还是从中接收消息。
*/
public interface Barista {
String OUTPUT_CHANNEL = "output_channel";
//注解@Output声明了它是一个输出类型的通道,名字是output_channel。这一名字与app1中通道名一致,表明注入了一个名字为output_channel的通道,类型是output,发布的主题名为mydest。
@Output(Barista.OUTPUT_CHANNEL)
MessageChannel logoutput();
}
复制代码
3、クラスRabbitmqSenderの定義
//启动这个绑定
@EnableBinding(Barista.class)
@Service //注入到spring容器
public class RabbitmqSender {
//注入Barista
@Autowired
private Barista barista;
// 发送消息
public String sendMessage(Object message, Map<String, Object> properties) throws Exception {
try{
MessageHeaders mhs = new MessageHeaders(properties);
Message msg = MessageBuilder.createMessage(message, mhs);
boolean sendStatus = barista.logoutput().send(msg);
System.err.println("--------------sending -------------------");
System.out.println("发送数据:" + message + ",sendStatus: " + sendStatus);
}catch (Exception e){
System.err.println("-------------error-------------");
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
return null;
}
}
复制代码
4、application.properties
server.port=8001
server.servlet.context-path=/producer
spring.application.name=producer
spring.cloud.stream.bindings.output_channel.destination=exchange-3
## group相当于RabbitMQ中Queue的名称
spring.cloud.stream.bindings.output_channel.group=queue-3
##以下为集群环境配置,rabbit_cluster与下面的spring.cloud.stream.binders.rabbit_cluster是对应的。
spring.cloud.stream.bindings.output_channel.binder=rabbit_cluster
spring.cloud.stream.binders.rabbit_cluster.type=rabbit
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.addresses=localhost:5672
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.username=user_cp
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.password=123456
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.virtual-host=/vhost_cp
复制代码
2.1消費者エンド
1は、依存関係のpom.xmlが導入され、
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cp</groupId>
<artifactId>rabbitmq-springcloudstream-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rabbitmq-springcloudstream-consumer</name>
<description>rabbitmq-spring</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
図2に示すように、インタフェースが定義されているバリスタ
/**
* 这里的Barista接口是定义来作为后面类的参数,这一接口定义来通道类型和通道名称。
* 通道名称是作为配置用,通道类型则决定了app会使用这一通道进行发送消息还是从中接收消息。
*/
public interface Barista {
String INPUT_CHANNEL = "input_channel";
//注解@Input声明了它是一个输入类型的通道,名字是Barista.INPUT_CHANNEL,也就是position3的input_channel。这一名字与上述配置app2的配置文件中position1应该一致,表明注入了一个名字叫做input_channel的通道,它的类型是input,订阅的主题是position2处声明的mydest这个主题
@Input(Barista.INPUT_CHANNEL)
SubscribableChannel loginput();
}
复制代码
3、クラスRabbitmqReceiverの定義
//启动binding
@EnableBinding(Barista.class)
@Service
public class RabbitmqReceiver {
@StreamListener(Barista.INPUT_CHANNEL)
public void receiver(Message message) throws Exception {
//手工签收必须要有channel与deliveryTag
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);
System.out.println("消费完毕------------");
//批量签收设置为false
channel.basicAck(deliveryTag, false);
}
}
复制代码
4、application.properties
server.port=8002
server.context-path=/consumer
spring.application.name=consumer
spring.cloud.stream.bindings.input_channel.destination=exchange-3
spring.cloud.stream.bindings.input_channel.group=queue-3
spring.cloud.stream.bindings.input_channel.binder=rabbit_cluster
##默认监听数
spring.cloud.stream.bindings.input_channel.consumer.concurrency=1
##针对消费端channel进行设置,是否支持requeue,重回队列
spring.cloud.stream.rabbit.bindings.input_channel.consumer.requeue-rejected=false
##是否支持签收,签收模式:手工签收
spring.cloud.stream.rabbit.bindings.input_channel.consumer.acknowledge-mode=MANUAL
##服务重连
spring.cloud.stream.rabbit.bindings.input_channel.consumer.recovery-interval=3000
##是否持久化订阅
spring.cloud.stream.rabbit.bindings.input_channel.consumer.durable-subscription=true
##最大监听数
spring.cloud.stream.rabbit.bindings.input_channel.consumer.max-concurrency=5
##采用rabbitmq方式,也可以采用kafka
spring.cloud.stream.binders.rabbit_cluster.type=rabbit
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.addresses=localhost:5672
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.username=user_cp
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.password=123456
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.virtual-host=/vhost_cp
复制代码
3.テストを実行します
消費者側を実行している3.1
プロジェクトを開始した後、制御局が生成し、Exchangeキューされたビュー
プロジェクトを開始した後、SpringCloudStreamは、Exchangeおよびキューを生成しました。
3.2を実行している生産終了テストコード
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private RabbitmqSender rabbitmqSender;
@Test
public void sendMessageTest1() throws InterruptedException {
for(int i = 0; i < 1; i ++){
try {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("SERIAL_NUMBER", "12345");
properties.put("BANK_NUMBER", "abc");
properties.put("PLAT_SEND_TIME", DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
rabbitmqSender.sendMessage("Hello, I am amqp sender num :" + i, properties);
} catch (Exception e) {
System.out.println("--------error-------");
e.printStackTrace();
}
}
TimeUnit.SECONDS.sleep(2000);
}
}
复制代码
試験方法の実行:sendMessageTest1()を、印刷された結果を見ます。
エンド印刷生産実績:
消費者側の印刷結果:
概要
これらの章では、我々は学習によって春AMQPの知識を学んだ、私たちは私たちのフォローアップ調査のために、作業の使用は強固な基盤を築いてきたように、春のRabbitMQチームは、深い理解を持って継承し、そして最終的に我々はSpringBootを統合しますそして、より便利で、より効率的SpringCloudStreamは、我々のアプリに入る一体化します!学習の三つの塊、学習のRabbitMQ、ステートメントのメッセージ、メッセージテンプレート、SimpleMessageListenerContainer、MessageListenerAdapter、MessageConverter。サポート列変換、JSONコンバーター、Javaオブジェクトを変換し、複数のオブジェクトの変換、フロー変換(写真、文書など)。SpringBootとの統合は非常に、非常に簡略化され、わずか数は、メッセージを送受信するように構成することができます。SpringCloudStreamの性質に関する複数の機関の入力と出力の層を追加します。MQ後に交換するには、チャネルレベルのコードを変更することはできません。生産側はRabbitMQのであってもよいし、消費者側はカフカです。
文末
個人的なマイクロチャネル公衆番号へようこそ注意:Coderのプログラムの最新オリジナルな技術に関する記事と無料の学習教材のため、多くのブティックマインドマップ、インタビューデータ、PMPの準備資料あなたがリードするために、待っているあなたは、いつでも、どこでも技術的な知識を習得することができます!QQのグループを作成します:315 211 365を、私たちは一緒にグループ交換研究に歓迎します。ありがとうございます!また、必要としている友人の側に導入することができます。
記事のGithubに含ま:github.com/CoderMerlin ... Gitee:gitee.com/573059382/c ...歓迎の注意と星〜
メッセージングミドルウェア--RabbitMQすべてここに(8)高度な機能!(AT)