「サービスガバナンス-アプリケーションアーキテクチャの進化」では、分散サービスアーキテクチャでは、ビジネスの再利用と統合を改善するための分散サービスフレームワーク(RPC)が重要であると述べられています。ダボはそれらの典型的な代表です。
今日は、Dubboのソースコードを手作業で分解して、その本質を完全に理解するという目的を達成します。
Dubboがリモートプロセス通信を実現する方法
コードを手作業で引き裂く前に、マクロを理解してみましょう。
上記はDubboのデプロイメントアーキテクチャです。登録センター、構成センター、およびメタデータセンターの3つの集中コンポーネントのそれぞれの責任と作業方法は次のとおりです。
登録センター。コンシューマーとプロバイダー間のアドレス登録と検出を調整する
構成センター。
Dubbo起動フェーズのグローバル構成を保存して、環境間の共有と構成のグローバルな一貫性を確保します
サービスガバナンスルール(ルーティングルール、動的構成など)の保存とプッシュを担当します。
メタデータセンター。
プロバイダーによって報告されたサービスインターフェイスメタデータを受信し、管理者などのコンソールの運用および保守機能を提供します(サービステスト、インターフェイスドキュメントなど)。
サービス検出メカニズムの補足として、レジストリの追加拡張と同等の追加のインターフェイス/メソッドレベルの構成情報同期機能を提供します。
上記の3つのセンターは、Dubboを実行するための必須条件ではありません。ユーザーは、展開を簡素化するために、自分のビジネス条件に応じて1つ以上のセンターのみを有効にすることを決定できます。通常、すべてのユーザーは独立したレジストリセンターでDubboサービスの開発を開始し、マイクロサービスの進化の過程で、必要に応じて構成センターとメタデータセンターが徐々に導入されます。
以下は、Dubboの初期のアーキテクチャです。このアーキテクチャのコアコンポーネントには、Dubboを実行するための基本的に最も単純なアーキテクチャであるレジストリのみが含まれています。レジストリも弱い非同期依存関係であり、唯一の強い依存関係はステップ4.呼び出しです。つまり、RPC呼び出しは、ダウンストリーム部分への要求を開始します。
ダボソースコード-シーン設定
Dubboのコアソースコードを分解してみましょう。理解を深めるために、httpプロトコルを使用したDubboのデフォルトのdubboプロトコルの説明を以下に示します。
次のコードが達成したい効果は上の図に示すように、最初にアイデアについて話しましょう。
まず、サービスプロバイダーが存在し、レジストリに登録する必要があります。レジストリは基本的に、サービスプロバイダーのアクセスアドレスが保存される場所です。このURLは必ずしもhttpプロトコルのアドレスではなく、本質的にはアプリケーション層プロトコルのアドレスであり、違いはありません。
サービスプロバイダーは、サービスの実装クラスを指定する必要があります。
サービスプロバイダーはネットワーク通信サービスを開始し、サービスを公開します。
サービスの利用者は対応するサービスを見つけます
サービスコンシューマーが通話を開始します
最初にシナリオを設計しましょう。公開されるサーバーは次のとおりです。
サービスインターフェース
実装クラス
上記を、サービスプロバイダーのコアに5行のコード、サービスコンシューマーのコアに5行のコードを使用して実装します。
ダボソースコード-サービスプロバイダー
5行のコード
簡単に言えば、サービスを登録して公開することです。この考えによれば、次のプロバイダーコードフレームワークを取得することは難しくありません。有効なコードは全部で5行あります。1行ずつ説明しましょう。
最初の行
メインラインコードの有効なコードの最初の行に戻ります。これは、自分で作成したurlオブジェクトをカプセル化します。
これは、ホスト名ポートを格納する単純なオブジェクトです。
二行目
有効なコードの2行目の機能は、URLをリモート登録センターに登録することです。登録センターのストレージを次のように構成しましょう。
ここでは、マップを使用してレジストリをシミュレートします。次のコードを取得することは難しくありません。
保存とは、シミュレートするファイルを作成することです。これは重要ではありません。完全を期すために簡単に説明します。
3行目
有効なコードの3行目は、インターフェイスに対応する実装クラスを指定することです。これもマップデータ構造を使用します。基本的にアクセス。
4行目
有効なコードの4行目は、getプロトコルです。フレームワークとして、マルチプロトコルをサポートする必要があります。これは簡単な実装です。
プロトコルのインターフェースは2つのアクションを指定します。1つは開始時に実行するアクションで、もう1つは送信時に実行するアクションです。
5行目
最初に実装について心配する必要はありません。メインラインコードの5行目に戻ってください。5行目は、URLを渡した後、プロトコルの開始を呼び出すことです。次に、startupメソッドの実装を見てみましょう。
httpServerを起動することです。httpServer.startの特定の実装を見てみましょう。これは、Tomcatを起動するためのものです。重要な点は、DispatcherServletを追加し、すべての要求をインターセプトすることです。赤い枠でマークしました
これは基本的に、Webコンテナとサーブレットのコアの役割を示しています。Webコンテナは主にネットワーク通信を担当し、サーブレットはJavaアプリケーションの内部ルーティング配布です。ルーティング配布がどのように機能するかを見てみましょう。
HttpServerHandler.handlerメソッドがどのように実装されているかを分析してみましょう。3つのステップで:
最初のステップは、リクエスト入力ストリームを解析することです。
2番目のステップは、呼び出されるインターフェイスを解析し、ローカル登録キャッシュから実装クラスを取得することです。
3番目のステップは、Javaリフレクションメカニズムを使用して、解釈された要求パラメーターを実装クラスに渡し、実際の呼び出しを開始することです。
以上で、サービスエクスポージャーのプロセス全体が完了します。
ダボソースコード-サービス利用者
5行のコード
クライアント呼び出しのプロセス全体は比較的単純で、2つのステップに分かれています。
プロキシを介して実装クラスを見つける
電話を掛ける
重要なロジックは、エージェントがどのように実装するかです。
最初の行
有効なコードの最初の行:Invacationオブジェクトをカプセル化し、インターフェイス名、メソッド名、およびメソッドパラメーターを渡します。
二行目
有効なコードの2行目:レジストリからURLリストを取得します
3行目
コードの3行目、取得したURLリストのため、送信先のURLを選択するにはどうすればよいですか?ここでは、ランダムアルゴリズムを使用して送信先のアドレスを決定します。これは、dubboのデフォルトのアドレス選択戦略でもあります。
4行目
4行目は、サービスプロバイダー側で導入された取得プロトコルで、次の行に直接移動します。
5行目
5行目は、プロトコルを介して無効化オブジェクトをURLに送信することです。
httpProtocalが内部でどのように実装されているかをご覧ください。
内部は非常にシンプルです。つまり、httpClientを呼び出してリクエストを送信します。このhttpClientは自分で作成したものですが、その機能はオープンソースのものと似ています。見てみましょう:
要約する
「 Mybatisの本質と原則」では、mybatisの本質的な原則を探求するために、mybatisのコアを含む単純なコードを分解しました。これはDubboのソースコードを壊してしまいましたね。
今日説明されているコードの完全なリンクを確認しましょう。
サービスプロバイダーは、インターフェイスをレジストリに登録し、対応する実装クラスを指定します。tomcat、nettyなどを介してネットワーク通信を実装し、サービスを公開します。内部的には、サーブレットおよびその他の実装ルートを使用して、コンシューマー要求を受信したときに対応する実装クラスを検索します。
サービスコンシューマーは、レジストリからURLリストを取得し、乱数などのアルゴリズムを使用してURLを検索し、パラメーターとメソッド名をhttpなどのプロトコルの要求パラメーターとして使用して呼び出しを開始します。
今、誰もがあなたの目を閉じてそれについて考えます、それはあなたに明らかなダボフレームワークのコア原則です〜
一生のプログラミング
公式アカウントプラットフォームがプッシュルールを変更したため、コンテンツを見逃したくない場合は、コンテンツを読んだ後に[視聴]をクリックし、「スター」を追加して、新しい記事のプッシュがすべてサブスクリプションに表示されるようにしてください。初めてのリスト。
PDCAの方法論、更新を見逃していないか確認してください:毎週水曜日の午後8時頃に記事を更新します。受け取っていない場合は、[Programming Life]パブリックアカウントを開いて見つけてください(*^▽^*)