Dubboのソースコードを手で引き裂き、RPCの原理を完全に理解する

サービスガバナンス-アプリケーションアーキテクチャの進化」では、分散サービスアーキテクチャでは、ビジネスの再利用と統合を改善するための分散サービスフレームワーク(RPC)が重要であると述べられています。ダボはそれらの典型的な代表です。

今日は、Dubboのソースコードを手作業で分解して、その本質を完全に理解するという目的を達成します。

Dubboがリモートプロセス通信を実現する方法

コードを手作業で引き裂く前に、マクロを理解してみましょう。

831d580f6493afd044cbb796feca217a.png

上記はDubboのデプロイメントアーキテクチャです。登録センター、構成センター、およびメタデータセンターの3つの集中コンポーネントのそれぞれの責任と作業方法は次のとおりです。

  • 登録センター。コンシューマーとプロバイダー間のアドレス登録と検出を調整する

  • 構成センター。

    • Dubbo起動フェーズのグローバル構成を保存して、環境間の共有と構成のグローバルな一貫性を確保します

    • サービスガバナンスルール(ルーティングルール、動的構成など)の保存とプッシュを担当します。

  • メタデータセンター。

    • プロバイダーによって報告されたサービスインターフェイスメタデータを受信し、管理者などのコンソールの運用および保守機能を提供します(サービステスト、インターフェイスドキュメントなど)。

    • サービス検出メカニズムの補足として、レジストリの追加拡張と同等の追加のインターフェイス/メソッドレベルの構成情報同期機能を提供します。

上記の3つのセンターは、Dubboを実行するための必須条件ではありません。ユーザーは、展開を簡素化するために、自分のビジネス条件に応じて1つ以上のセンターのみを有効にすることを決定できます。通常、すべてのユーザーは独立したレジストリセンターでDubboサービスの開発を開始し、マイクロサービスの進化の過程で、必要に応じて構成センターとメタデータセンターが徐々に導入されます。

以下は、Dubboの初期のアーキテクチャです。このアーキテクチャのコアコンポーネントには、Dubboを実行するための基本的に最も単純なアーキテクチャであるレジストリのみが含まれています。レジストリも弱い非同期依存関係であり、唯一の強い依存関係はステップ4.呼び出しです。つまり、RPC呼び出しは、ダウンストリーム部分への要求を開始します。

b9c4f7541ab6ec9d49cf1a33db9d4944.png

ダボソースコード-シーン設定

Dubboのコアソースコードを分解してみましょう。理解を深めるために、httpプロトコルを使用したDubboのデフォルトのdubboプロトコルの説明を以下に示します。

1fd6d986893a554be71fa8ff1358b6ad.png

次のコードが達成したい効果は上の図に示すように、最初にアイデアについて話しましょう。

  1. まず、サービスプロバイダーが存在し、レジストリに登録する必要があります。レジストリは基本的に、サービスプロバイダーのアクセスアドレスが保存される場所です。このURLは必ずしもhttpプロトコルのアドレスではなく、本質的にはアプリケーション層プロトコルのアドレスであり、違いはありません。

  2. サービスプロバイダーは、サービスの実装クラスを指定する必要があります。

  3. サービスプロバイダーはネットワーク通信サービスを開始し、サービスを公開します。

  4. サービスの利用者は対応するサービスを見つけます

  5. サービスコンシューマーが通話を開始します

最初にシナリオを設計しましょう。公開されるサーバーは次のとおりです。

サービスインターフェース

9ced9afd203afa37ccc1b6f82d50b978.png

実装クラス

4d884be2d7e68aa4c5d1b752a0d890d5.png

上記を、サービスプロバイダーのコアに5行のコード、サービスコンシューマーのコアに5行のコードを使用して実装します。

ダボソースコード-サービスプロバイダー

5行のコード

簡単に言えば、サービスを登録して公開することです。この考えによれば、次のプロバイダーコードフレームワークを取得することは難しくありません。有効なコードは全部で5行あります。1行ずつ説明しましょう。

455753ce73a7fb7cd5229e1ed15e41f6.png

最初の行

メインラインコードの有効なコードの最初の行に戻ります。これは、自分で作成したurlオブジェクトをカプセル化します。

05d0b1b6b0b30a32f4b95c5bafbffadb.png

これは、ホスト名ポートを格納する単純なオブジェクトです。

二行目

有効なコードの2行目の機能は、URLをリモート登録センターに登録することです。登録センターのストレージを次のように構成しましょう。

ac6a28c916eed4d1dd86aa1724938c7b.png

ここでは、マップを使用してレジストリをシミュレートします。次のコードを取得することは難しくありません。

517750c008ae2f357afdf3ea772dcef9.png

保存とは、シミュレートするファイルを作成することです。これは重要ではありません。完全を期すために簡単に説明します。

3ca0075ec44781d1a6df26c6d3565c20.png

3行目

有効なコードの3行目は、インターフェイスに対応する実装クラスを指定することです。これもマップデータ構造を使用します。基本的にアクセス。

050086a5967e292a0bf33e50977246f4.png

4行目

有効なコードの4行目は、getプロトコルです。フレームワークとして、マルチプロトコルをサポートする必要があります。これは簡単な実装です。

19fdb0363549debfec99afce1a6325a1.png

プロトコルのインターフェースは2つのアクションを指定します。1つは開始時に実行するアクションで、もう1つは送信時に実行するアクションです。

06afbccd15542d61b3f89bfdada31300.png

5行目

最初に実装について心配する必要はありません。メインラインコードの5行目に戻ってください。5行目は、URLを渡した後、プロトコルの開始を呼び出すことです。次に、startupメソッドの実装を見てみましょう。

ed94b53b7079b665d519040625bd1e88.png

httpServerを起動することです。httpServer.startの特定の実装を見てみましょう。これは、Tomcatを起動するためのものです。重要な点は、DispatcherServletを追加し、すべての要求をインターセプトすることです。赤い枠でマークしました

c8d081a3d5b7ce0cd88f5d2538a3f1a9.png

これは基本的に、Webコンテナとサーブレットのコアの役割を示しています。Webコンテナは主にネットワーク通信を担当し、サーブレットはJavaアプリケーションの内部ルーティング配布です。ルーティング配布がどのように機能するかを見てみましょう。

4e848e70f87c65bdfc37f16af66dc37c.png

HttpServerHandler.handlerメソッドがどのように実装されているかを分析してみましょう。3つのステップで:

9eea45a37144de1a989528143037205e.png

最初のステップは、リクエスト入力ストリームを解析することです。

2番目のステップは、呼び出されるインターフェイスを解析し、ローカル登録キャッシュから実装クラスを取得することです。

3番目のステップは、Javaリフレクションメカニズムを使用して、解釈された要求パラメーターを実装クラスに渡し、実際の呼び出しを開始することです。

以上で、サービスエクスポージャーのプロセス全体が完了します。

ダボソースコード-サービス利用者

5行のコード

クライアント呼び出しのプロセス全体は比較的単純で、2つのステップに分かれています。

  1.  プロキシを介して実装クラスを見つける

  2. 電話を掛ける

929ab7415d251d001e3e18ed8755f3a4.png

重要なロジックは、エージェントがどのように実装するかです。

43129375b84c5adc220efa3f7916ea7c.png

最初の行

有効なコードの最初の行:Invacationオブジェクトをカプセル化し、インターフェイス名、メソッド名、およびメソッドパラメーターを渡します。

1853bc22c85186a1e50dc14076ec713f.png

二行目

有効なコードの2行目:レジストリからURLリストを取得します

3行目

コードの3行目、取得したURLリストのため、送信先のURLを選択するにはどうすればよいですか?ここでは、ランダムアルゴリズムを使用して送信先のアドレスを決定します。これは、dubboのデフォルトのアドレス選択戦略でもあります。

4e6016931d09ee384a5304631671a645.png

4行目

4行目は、サービスプロバイダー側​​で導入された取得プロトコルで、次の行に直接移動します。

5行目

5行目は、プロトコルを介して無効化オブジェクトをURLに送信することです。

e187417b9e922b44bef779158efbb393.png

httpProtocalが内部でどのように実装されているかをご覧ください。

3f10204d1adcb2936ca2deda1b2cbafb.png

内部は非常にシンプルです。つまり、httpClientを呼び出してリクエストを送信します。このhttpClientは自分で作成したものですが、その機能はオープンソースのものと似ています。見てみましょう:

004aa7ac1cab66d322a95feeaffc2324.png

要約する

「 Mybatisの本質と原則」では、mybatisの本質的な原則を探求するために、mybatisのコアを含む単純なコードを分解しました。これはDubboのソースコードを壊してしまいましたね。

今日説明されているコードの完全なリンクを確認しましょう。

e8356b6f4e38e17c4f931016a885d018.png

サービスプロバイダーは、インターフェイスをレジストリに登録し、対応する実装クラスを指定します。tomcat、nettyなどを介してネットワーク通信を実装し、サービスを公開します。内部的には、サーブレットおよびその他の実装ルートを使用して、コンシューマー要求を受信したときに対応する実装クラスを検索します。

サービスコンシューマーは、レジストリからURLリストを取得し、乱数などのアルゴリズムを使用してURLを検索し、パラメーターとメソッド名をhttpなどのプロトコルの要求パラメーターとして使用して呼び出しを開始します。

今、誰もがあなたの目を閉じてそれについて考えます、それはあなたに明らかなダボフレームワークのコア原則です〜

一生のプログラミング

公式アカウントプラットフォームがプッシュルールを変更したため、コンテンツを見逃したくない場合は、コンテンツを読んだ後に[視聴]をクリックし、「スター」を追加して、新しい記事のプッシュがすべてサブスクリプションに表示されるようにしてください。初めてのリスト。

PDCAの方法論、更新を見逃していないか確認してください:毎週水曜日の午後8時頃に記事を更新します。受け取っていない場合は、[Programming Life]パブリックアカウントを開いて見つけてください(*^▽^*)

おすすめ

転載: blog.csdn.net/xiexiaojing/article/details/123469545