SpringBoot-ニュース
1.メッセージサービスの基本概念
1.メッセージサービスの2つの重要な概念:
メッセージブローカー(メッセージサーバー)と宛先(宛先)。メッセージ送信者がメッセージを送信すると、メッセージブローカーに引き継がれ、メッセージブローカーはメッセージの配信を保証します。指定された宛先へ。
2.メッセージキューには、主に2つの形式の宛先があります。
(1)キュー:ポイントツーポイント通信。
- 送信者はメッセージを送信し、メッセージブローカーはそれをキューに入れ、必要に応じて、メッセージ受信者はキューからメッセージコンテンツを取得します。
(2)トピック:メッセージのパブリッシュ/サブスクライブ通信。
- 送信者がトピックにメッセージを送信し、複数の受信者がこのトピックをサブスクライブすると、メッセージが到着すると同時にメッセージが受信されます。
3.メッセージキューは主に次のように完了できます。
(1)非同期処理
アプリケーション要求を順番に処理する必要がないため、システム全体のスループットが向上します。
(2)
アプリケーション間のデカップリングアプリケーションを関連付ける場合、あまり多くのインターフェースを埋め込む必要がないため、カップリングの程度が大幅に低下する可能性があります。
(3)トラフィックのピーク削減
スパイクビジネスを処理する場合、バックエンドサーバーは独自の機能に従ってビジネスを処理できます。これにより、サーバーへのプレッシャーをある程度軽減し、サーバーの破壊を防ぐことができます。
4.メッセージサービスプロトコルの仕様
(1)JMS(Javaメッセージサービス)JAVAメッセージサービス
- Java API
- JMSはJAVAAPIレベルで標準を定義します。Javaシステムでは、複数のクライアントがアプリケーション変更コードなしでJMSを介して対話できますが、クロスプラットフォームのサポートは不十分です。
- JVMメッセージブローカーの仕様に基づくと、ActiveMQとHornetMQはJMSの実装です。
(2)AMQP(Advanced Message Queuing Protocol)
- ネットワークレベルのプロトコル
- 高度なメッセージキュープロトコルもメッセージブローカー仕様であり、JMSと互換性があります
- AMQPは、ワイヤーレベルレイヤーのプロトコル標準を定義します。当然、クロスプラットフォームおよびクロス言語の特性があります。
- RabbitMQはAMQPの実装です。
(3)JMSとAMQPの比較
JMS | AMQP | |
---|---|---|
定義 | Java API | ネットワークレベルのプロトコル |
クロスプラットフォーム/言語ですか | 番号 | はい |
メッセージモデル | (1)ポイントツーポイント (2)パブリッシュ/サブスクライブ |
(1)直接交換 (2)ファンアウト交換 (3)トピックの変更 (4)ヘッダー交換 (5)システム交換の 最後の4つは、JMSのpub / subモデルと大差ありませんが、ルーティングメカニズムのみがより詳細になっています。 |
サポートメッセージタイプ | TextMessage、 MapMessage、 BytesMessage、 StreamMessage、 ObjectMessage、 Message(メッセージヘッダーと属性のみ) |
byte []実際のアプリケーションでは、シリアル化して送信できる複雑なメッセージがあります。 |
5.Springによるメッセージサービスのサポート
- spring-jmsはJMSのサポートを提供します
- spring-rabbitはAMQPのサポートを提供し、メッセージブローカーに接続するためにConnectionFactoryの実装を必要とします
- メッセージを送信するためにJmsTemplate、RabbitTemplateを提供します
- @JmsListener(JMS)、@ RabbitListener(AMQP)アノテーションは、メソッドでメッセージエージェントによって公開されたメッセージを監視します
- @ EnableJms、@ EnableRabbit有効化サポート
6、メッセージサービスのSpringBoot構成
- JmsAutoConfiguration
- RabbitAutoConfiguration
次に、AMQPの実装-RabbitMQ
RabbitMQは、erlang言語に基づいて開発されたAMQP(Advanved Message Queue Protocol)のオープンソース実装です。
1.基本的な考え方
(1)メッセージ
メッセージは、メッセージヘッダーとメッセージ本文で構成されます。メッセージ本文は不透明であり、メッセージヘッダーは、ルーティングキー(ルーティングキー)、優先度(他のメッセージに対する優先度)、配信モード(メッセージに永続ストレージが必要な場合があることを示す)など、一連のオプションの属性で構成されます。等
(2)パブリッシャー
メッセージのプロデューサーは、メッセージをエクスチェンジに公開するクライアントアプリケーションです。
(3)Exchange
サーバーのスイッチは、プロデューサーから送信されたメッセージを受信し、これらのメッセージをサーバーのキューにルーティングするために使用されます。スイッチは、メッセージの宛先を決定します。Exchangeには、ダイレクト(デフォルト)、ファンアウト、トピック、ヘッダーの4種類があります。
(4)
メッセージを保存するために使用されるキューメッセージキュー。これは、メッセージのコンテナーであり、メッセージの終わりです。メッセージは1つ以上のキューに入れることができます。メッセージはキューにあり、コンシューマーがこのキューに接続してメッセージを削除するのを待っています。
(5)バインディング
バインディング。メッセージキューと交換の間の関連付けに使用されます。バインディングは、交換とメッセージキューをルーティングキーで接続するルーティングルールです。ExchangeとQueueのバインディングは、多対多の関係になる可能性があります。
(6)
TCP接続などの接続ネットワーク接続。
(7)チャネル
、多重化接続における独立した双方向データストリームチャネル。チャネルは、実際のTCP接続内で確立された仮想接続です。AMQPコマンドはチャネルを介して送信されます。メッセージの公開、キューへのサブスクライブ、メッセージの受信のいずれであっても、これらのアクションはすべてチャネルを介して完了します。オペレーティングシステムがTCPを確立して破棄するのは非常にコストがかかるため、TCP接続を再利用するためにチャネルの概念が導入されています。
(8)コンシューマー
メッセージコンシューマー、メッセージキューからメッセージを取得できるクライアントアプリケーション。
(9)仮想ホスト
仮想ホスト。スイッチ、メッセージキュー、および関連オブジェクトのバッチを表します。仮想ホストは、同じ認証および暗号化環境を共有する独立したサーバードメインです。各仮想ホストは、基本的に、独自のキュー、スイッチ、バインディング、およびアクセス許可メカニズムを備えたRabbitMQサーバーのミニバージョンです。VhostはAMQPの概念の基礎であり、接続時に指定する必要があります。RabbitMQの
デフォルトのvhostはです/
。
(10)ブローカー
はメッセージキューサーバーエンティティを表します
2.RabbitMQの操作メカニズム
(1)
AMQPでのメッセージルーティングAMQPのメッセージルーティングプロセスとJava開発者が精通しているJMSの間には、いくつかの違いがあります。ExchangeとBindingの役割がAMQPに追加されました。プロデューサーはメッセージをExchangeに公開し、BindingはExchangeのメッセージを送信するキューを決定します。
(2)Exchange
Exchangeには、メッセージを配信する際のさまざまな配信戦略があります。現在、ダイレクト、ファンアウト、トピック、およびヘッダーの4つのタイプがあります。ヘッダーは、現在ほとんど使用されていないルーティングキーではなく、AMQPメッセージヘッダーを介してメッセージキューと一致します。
直接:メッセージ内のルーティングキーは、キュー名と完全に一致する必要があります。
ファンアウト:(パブリッシュ/サブスクライブ)ファンアウトタイプの交換に送信される各メッセージは、すべてのバインドされたキューに配信されます。ファンアウトスイッチは、サブネットブロードキャストのようにルーティングキーを処理せず、サブネット内の各ホストがメッセージのコピーを取得します。ファンアウトタイプは、メッセージを転送するのに最も速いタイプです。
トピック:ルーティングキーをパターンに一致させます。2つのワイルドカード:#
0個以上の単語に*
一致し、1つの単語に一致します。
3.RabbitMQのインストールとテスト
(1)RabbitMQをプルします
docker pull 阿里云镜像加速地址/library/rabbitmq:3-management
(2)インストールが成功したかどうかを確認します
docker images
(3)RabbitMQ
5672の起動:サーバーポート
15672:バックグラウンド管理インターフェイスポート
docker run -d -p 5672:5672 -p 15672:15672 --name myRabbitMQ 92c743b6c055
(4)実行中のコンテナ
docker psを表示します
(5)バックグラウンド管理インターフェイスにアクセスし
ますデフォルトのユーザー名/パスワードはguest / guestです
(6)テスト
1)エクスチェンジとキューの
追加新しいエクスチェンジを
追加すると、合計3つのエクスチェンジが
追加されます。4つのキューを追加します。
2)バインディング
直接バインディング:
ファンアウトバインディング:
ルーティングルールをバインドする必要はありません。
トピックバインディング:
3)メッセージ送信テスト:
キューの場合、ルーティングキーとキュー名のみが完全に一致します。
受信メッセージ:
ファンアウトの場合、ルーティングキーが何であっても、ブロードキャストの形式ですべてのキューに送信されます
。トピックの場合:
指定されたルーティングルールに一致するキューのみがメッセージを受信できます。ここではcbj.newsとglp.newsのみです。ニュースを受け取ることができます。
4.SpringBootとRabbitMQの統合
RabbitAutoConfiguration
RabbitProperties:RabbitMQの構成をカプセル化します
RabbitTemplate:メッセージをRabbitMQに送受信します
AmqpAdmin:システム管理機能コンポーネント
(1)依存関係を導入する
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
(2)application.properties構成
spring.rabbitmq.host=47.94.230.49
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
(3)
メッセージの送受信をテストするRabbitMQ
- send(exchange、routekey、message); sendを使用してメッセージを送信します。メッセージはそれ自体で作成する必要があります(メッセージヘッダーとメッセージ本文を含む)
- convertAndSend(exchange、routeKey、object):オブジェクトはデフォルトでメッセージ本文であり、自動的にシリアル化されてRabbitmqに送信されます。
RabbitMQ管理インターフェースから取得したデータ:
RabbitTemplateは、メッセージを処理するときにデフォルトでSimpleMessageConverter()を使用し
ます。RabbitAutoConfigurationでRabbitTemplateを構成する場合、コンテナーから独自のMessageConverterをインポートできます。
(4)MessageConverterをカスタマイズする
@Configuration
public class myAMQPConfig {
@Bean
public MessageConverter myMessageconverter(){
return new Jackson2JsonMessageConverter();
}
}
メッセージコンバータの設定が完了したら、次の手順を実行します。
(5)メッセージリストの監視メッセージリストの
リッスン、メッセージのリッスンに
使用@RabbitListener
するリアルタイムメッセージの受信、Rabbit関連のメモを開く必要があります@EnableRabbit
。
メインのスタートアップクラスに注釈を追加します。Messageを使用し@EnableRabbit
てメッセージ本文とメッセージヘッダーを取得できます
(6)JavaプログラムでExchange、キュー、およびバインディングルールを作成します
AmqpAdmin:Exchange、キュー、バインディングの作成に使用される管理コンポーネント
Exchangeの作成:
キューを作成します。
バインディング関係を作成します。
Binding(
文字列の宛先、バインドされる宛先
Binding.DestinationType destinationType、宛先タイプ
文字列交換、交換
文字列routingKey、ルーティングルール
@Nullable Map <String、Object>引数パラメーター
)
3、JMS実装-ActiveMQ
アップグレード待ち