Spring Cloud Stream バインダー アーキテクチャの分析と開発

Spring Cloud Stream バインダー アーキテクチャの分析と開発

ここに画像の説明を挿入
さまざまな使用シナリオに応じて、通常は適切なメッセージング ミドルウェアを選択します. たとえば、ログ収集シナリオには Kafka を使用することを選択できます, 通常、注文シナリオには RocketMQ を選択します. さまざまなメッセージング ミドルウェア クライアントは異なります, そして、ターゲットにする必要があります異なるメッセージ ミドルウェアは異なるコードを記述します。TOC 製品の場合、ビジネス シナリオに応じて適切なメッセージ ミドルウェアを選択できますが、TOB 製品の場合、顧客ごとにメッセージ ミドルウェアに対する要件が異なります。メッセージ ミドルウェアを便利に切り替える必要があり、コードをリファクタリングする必要はありません。

Spring Cloud Stream は、上記の問題をうまく解決するのに役立ちます。Binder を介して特定のメッセージ ミドルウェアを分離し、異なるメッセージ ミドルウェアの使用の違いを保護し、Binder Spring Cloud Stream に基づいてメッセージを送信および消費するための統一された構成と使用方法を提供します。ユーザーにとっては、使用されるメッセージ ミドルウェアの種類を気にせずに、Spring Cloud Stream を使用してメッセージを送受信する方法を理解するだけで済みます。Binder は、メッセージ ミドルウェアと通信せずにメッセージやトランザクションなどのその他の高度な機能を送受信する方法を担当する必要があります。そのため、spring-cloud-stream-binder-kafka、spring-cloud-stream-binder-rabbit など、到達できないメッセージ ミドルウェアのバインダーが見られます。また、仕様に応じて独自のニーズを満たすバインダーを開発することもできます。メッセージの量が少ないユーザーは、redis ベースのメッセージ ミドルウェアを使用でき、Spring Cloud Stream に接続するための対応する Binder を開発できます。以下に、Binder のアーキテクチャと Binder の開発方法を紹介します。

バインダー アーキテクチャの紹介とソース コードの分析

ここに画像の説明を挿入
ソースコードの観点から、Spring Cloud Stream が Binder とどのように対話するか、および Binder が具体的にどのようなことを行うかを見てみましょう

プロジェクト開始

プロジェクトが開始されると、まずプロジェクトの下にあるすべての依存バインダーがスキャンされ、バインダー情報がメモリ オブジェクトに格納されます。具体的には、次のことが行われます。

  • META-INF/spring.binders をスキャンして、BinderTypeRegistry オブジェクトの作成に使用されるバインダー タイプと対応する構成ローディング クラスを取得します。
    ここに画像の説明を挿入

  • BinderTypeRegistry に基づいて BinderFactory を構築します。BinderFactory には、スキャニング yaml ファイルの下に構成された Spring Cloud Steam に関連するバインダー情報と構成情報の両方が含まれています。
    ここに画像の説明を挿入

メッセージを送ります

プロジェクトが開始されて準備作業が完了し、メッセージ送信プロセスの観点からは、Spring Cloud Stream が Binder と連携すれば、メッセージ送信が完了します。

BinderFactory はバインダー インスタンスを取得します

プロジェクトの開始時にバインダーのすべての情報を BinderFactory に入れるため、メッセージを送信する最初のステップは、バインダーの情報に従ってバインダー インスタンスを作成し、バインダーの初期作業を完了することです。

バインダー構成クラスをロードする

Spring Cloud Stream は、DefaultBinderFactory の initializeBinderContextSimple メソッドを通じてバインダーに対応する構成クラスを読み込み、AnnotationConfigApplicationContext
コンテキスト オブジェクトを作成します
ここに画像の説明を挿入
.バインダーに対応する構成クラスを読み込んだ後、バインダーの初期化がトリガーされます

  • Binder 構成クラスを初期化し、Binding 構成クラスを初期化します
    ここに画像の説明を挿入
  • バインダー ターゲット プロバイダーを初期化する
    ここに画像の説明を挿入
  • チャネル バインダーを初期化する
    ここに画像の説明を挿入
バインダー インスタンスを取得する

バインダー インスタンスは、前の手順で作成されたコンテキスト オブジェクトを介して取得でき、取得したバインダー インスタンスはメモリにキャッシュされます。
ここに画像の説明を挿入

バインダーを使用して出力チャネルを特定のメッセージ ミドルウェアにバインドする

出力チャネルは Spring Cloud Stream の概念で、メッセージを送信する特定のクライアントに出力チャネルを関連付ける必要があり、バインダー インスタンスにはメッセージを送信するクライアントを構築するためのメソッドがあります。したがって、この手順では、特定の送信メッセージ クライアントを作成し、それを出力チャネルに関連付ける必要があります。詳細は次のとおりです。

  • 拡張されたプロデューサー構成情報を取得し、Spring Cloud Stream プロデューサー プロパティとマージします
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  • プロデューサー送信ターゲット プロバイダーを取得する
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  • 送信メッセージ インスタンスを作成し、送信メッセージ オブジェクトの初期化を完了する
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  • 出力チャネルを送信メッセージ インスタンスにバインドする
    ここに画像の説明を挿入
  • バインドを作成し、バインド解除などの後続の操作のために送信チャネルにキャッシュします
    ここに画像の説明を挿入
    ここに画像の説明を挿入

送信チャネル経由でメッセージを送信

送信チャネルと特定の送信クライアントのバインドが完了すると、メッセージを送信できます. 次のメソッドでは、特定のメッセージ ミドルウェアのクライアントを使用してメッセージの送信を完了します.
ここに画像の説明を挿入

要約する

上記のソースコード分析を通じて、Spring Cloud Stream がメッセージの送信、メッセージの消費、および構成パラメーターの統合管理をユーザーに提供することが明確にわかります。ただし、実際に送信と消費が実行されるときは、バインダーによって作成されたプロデューサー インスタンスとコンシューマー インスタンスによって行われます。バインダーによって作成されたこれらのプロデューサー インスタンスとコンシューマー インスタンスは特定のメッセージ ミドルウェアに関連付けられているため、異なるメッセージ ミドルウェアは異なるバインダーに対応します。バインダーは、Spring Cloud Steam と特定のメッセージ ミドルウェアの間のブリッジとして機能します。

開発例

以下は、独自のバインダーを作成する方法を具体的に説明します

spring.binders を作成する

resources/META-INF/spring.binders を作成し、バインダー タイプと対応する構成クラスを指定します。
ここに画像の説明を挿入

構成クラスを作成する

構成クラスは、バインダーの構成パラメーター クラス、Binding の構成パラメーター クラス、登録済みターゲット プロバイダー オブジェクト、およびメッセージ チャネル バインダー オブジェクトを含む拡張属性クラスをスキャンする必要があります。
ここに画像の説明を挿入

バインダー パラメーター クラス

バインダー パラメーター クラスは、アドレス、ユーザー名、パスワード、ポート、その他の情報など、特定のメッセージ ミドルウェア接続に関連する情報を格納するために使用されます。
ここに画像の説明を挿入

バインディング拡張属性構成クラス

これには、プロデューサー構成プロパティーとコンシューマー構成プロパティーが含まれます。送信と消費に必要な特別なパラメーターをここに配置できます.たとえば、メッセージ ミドルウェアとして redis を使用する場合、送信と消費に使用する DB の数を指定する必要があるため、このパラメーターを production と消費の構成クラスに配置する必要があります

  • RedisMQExtendedBindingProperties を作成し、AbstractExtendedBindingProperties を継承して、消費属性クラス、送信メッセージ属性クラス、およびバインディング属性クラスを指定します
    ここに画像の説明を挿入

  • RedisMQConsumerProperties 消費メッセージ構成クラスを作成する
    ここに画像の説明を挿入

  • RedisMQProducerProperties 送信メッセージ構成クラスを作成する

  • RedisMQBindingProperties 構成クラスを作成するには、BinderSpecificPropertiesProvider を実装する必要があります。属性は、消費メッセージ属性クラスと送信メッセージ属性クラスの両方です。
    ここに画像の説明を挿入

プロバイダ

パラメータが処理されたら、プロバイダーを作成する必要があります。プロバイダーは、メッセージを送信または消費するために必要なトピックとパーティションを記録します。プロバイダーは ProvisioningProvider を実装する必要があります
ここに画像の説明を挿入

メッセージ チャネル バインダー

メッセージ チャネル バインダーは、送信メッセージ インスタンスの作成、メッセージ インスタンスの消費、拡張プロデューサー属性クラス、拡張コンシューマー属性クラス、およびバインディング属性クラスの取得のためのクラスを提供する必要があります。AbstractMessageChannelBinder を継承して ExtendedPropertiesBinder を実装する
ここに画像の説明を挿入

具体的なプロデューサーの実装

特定のプロデューサ実装クラスは、特定のメッセージ接続の初期化作業、特定のメッセージ送信、およびその他の操作を完了します。Lifecycle を実装するには AbstractMessageHandler を継承する必要があります
ここに画像の説明を挿入

具体的な消費者の実装

特定のメッセージの消費を完了し、メッセージの消費を停止するには、MessageProducerSupport を継承する必要があります
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/github_38730134/article/details/128041096