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 を継承する必要があります