Javaベースの分散サービスフレームワークDubboの原理と事例分析
まえがき
Dubbo を紹介する前に、まず基本的な概念を理解しましょう:
Dubbo は RPC
フレームワークです。 .RPC
、つまり Remote Procedure Call
(リモート プロシージャ コール)、その反対はローカル プロシージャ コールです。分散アーキテクチャが登場する前は、シングル アプリケーション アーキテクチャと垂直アプリケーション アーキテクチャでローカル プロシージャが使用されていました。電話。これにより、プログラマがリモート呼び出しの詳細を明示的にコーディングすることなく、プログラムが別のアドレス空間 (通常はネットワーク上で共有される別のマシン) にあるプロシージャまたは関数を呼び出すことができます。
分散アーキテクチャ アプリケーション間のリモート呼び出しには、RPC
フレームワークが必要です。目的は、リモート呼び出しをローカル呼び出しと同じくらい単純にすることです。
Dubbo フレームワークには次のコンポーネントがあります
Consumer
つまり、リモート サービスを呼び出すサービス コンシューマです。インターフェイス プログラミングでは、どのインターフェイスを呼び出すことができるかを知っています。特定の実装では、フレームワークがインターフェイスの特定の実装を提供するプロキシ クラスを提供する必要があるため、コンシューマはどのインターフェイスを呼び出すだけで済み、特定の実装の取得は によって処理されます。プロキシクラス。
コンシューマは、呼び出しメソッド名とメソッド パラメータ値も指定する必要があります。
しかし、プロキシ クラスは、この時点でサーバー上のどのリモート メソッドを呼び出す必要があるのかをまだ認識していません。この時点で、呼び出すことができるリモート サービスのリストを取得するために登録センターが必要です。
リモート サーバーは通常、クラスター内に展開されるため、どのサーバーを呼び出すかについては、呼び出すのに最適なサーバーを選択するために負荷分散が必要です。
同時に、クラスターのフォールト トレラント メカニズムも必要です。さまざまな理由により、リモート呼び出しが失敗する可能性があります。このとき、安定性を確保するために呼び出しを再試行するには、フォールト トレラント メカニズムが必要です。リモート通話の。
同時に、通信とデータ送信を容易にするために、通信プロトコルとシリアル化形式がサービスプロバイダーと合意されます。
プロバイダー
つまり、サービスを公開するサービス プロバイダーです。サービス プロバイダーは、特定のインターフェイスを内部で実装し、そのインターフェイスを公開して、登録センターにサービスを登録します。サービス コンシューマはサービスを呼び出します。プロバイダは呼び出しリクエストを受信すると、合意された通信プロトコルを通じてリクエストを処理し、デシリアライズします。完了後、リクエストをスレッド プールに入れて処理します。スレッドはリクエストを受信し、対応するインターフェイス実装呼び出しを行い、呼び出しの結果を返します。
レジストリ
サービスの登録と検出のための登録センターです。登録センターは、サービス ディレクトリに相当するサービス アドレスの登録と検索を担当します。サービス プロバイダーと消費者開始時にのみ相互に登録されます。センターの対話、登録センターはリクエストを転送せず、プレッシャーは低いです。
#レジストリは、構成処理を一元化し、サブスクライバに変更を動的に通知することもできます。
しかし、なぜ登録センターが必要なのでしょうか?登録センターがないと無理なのでしょうか?
登録センターがない場合、サービス間の呼び出し関係は次のようになります。
サービスが増えると、サービス URL 構成管理が必要になります。ハードウェアロードバランサーへのシングルポイントプレッシャーも高まっています登録センターを利用することでサービスの一元管理、ソフトロードバランシングの実現、ハードウェアコストの削減が可能となります。登録センターの概略図:
Monitor
は、サービスのコール数とコール時間をカウントする監視センターです。洗練された監視と便利な操作とメンテナンスが不可欠であり、これは後のメンテナンスにとって非常に重要です。
Container
は、サービスが実行されるコンテナです。
#アーキテクチャコンテナ サービス コンテナは、起動、読み込み、実行を担当します。
プロバイダサービス プロバイダ
プロバイダサービス プロバイダが起動するときは、次のことを行う必要があります。リモート サーバーは、提供するサービスを検出し、
Registry 登録センターに登録できます。
コンシューマサービス コンシューマが開始されると、# に登録されます。 ##Registry
登録センター。必要なサービスへの加入
登録センターは、サービス プロバイダーのリストを消費者に返します。同時に、変更が発生した場合は、登録センターは、長時間の接続に基づいてリアルタイム データを消費者にプッシュします<p>サービス コンシューマがリモート サービスを呼び出す必要がある場合、ロード バランシング アルゴリズムに基づいて、プロバイダのアドレス リストからプロバイダ サーバーを選択して呼び出します。呼び出しが失敗した場合、クラスタのフォールト トレランスに基づいて呼び出しが再試行されます。戦略</p>
<p>サービス利用者とプロバイダーは、メモリ内の呼び出し数と呼び出し時間をカウントし、そのデータを <code>Monitor
監視センター
高可用性
#に送信します。- ##監視センターがダウンしても、サービスには影響しませんが、一部の統計データは失われます。
- センター クラスターの登録後他の登録センターに自動的に切り替える
- すべての登録センターがダウンした場合でも、サービス プロバイダーとコンシューマはローカル キャッシュを介して通信できます。お互いの情報を記録しますが、一方が変更を加えた場合、もう一方はそれを検出できません。
- サービス プロバイダーはステートレスです。サーバーがダウンしても、サーバーには影響しません。サービスを提供する他のサービス プロバイダーがあります
- すべてのサービス プロバイダーがダウンすると、サービス コンシューマは通常どおりに使用できなくなり、サービス プロバイダーが再接続して回復するまで無期限に再接続することになります。
サービス、ビジネス層、つまりビジネス ロジック日常の開発におけるレイヤー
Config、構成レイヤー、
ServiceConfig と
ReferenceConfig を中心とする外部構成インターフェイスは、構成クラスを直接初期化できます。または、構成クラス
Proxy、サービス プロキシ層、サービス インターフェイス透過プロキシ、サービス クライアント
Stub およびクライアント
Skeleton を生成する Spring の構成解析を通じて生成できます。 、リモート呼び出しと返される結果を担当します。
Registry、登録センター層は、サービス URL を中心として、サービス アドレスの登録と検出をカプセル化します。インターフェイスは
RegistryFactory、
Registry、
RegistryService
Cluster ルーティングおよびクラスターのフォールト トレランス層は、ルーティング、負荷分散をカプセル化します。複数のプロバイダーのクラスター フォールト トレランスと、登録センターのブリッジを行います。ロード バランシングを通じて呼び出す特定のノードの選択、特別な呼び出しリクエストの処理、およびリモート呼び出しの失敗に対するフォールト トレランス措置を講じます。
Monitor、監視層、RPC 呼び出しの数と呼び出し時間の監視とカウントを担当します
Portocol、リモート呼び出し層、主に RPC リモート呼び出しメソッド
Exchange、要求応答モデルのカプセル化に使用される情報交換層
Transport、ネットワーク トランスポート層、抽象ネットワーク送信統合インターフェイス、
Mina と
Netty が利用可能です
(シリアル化レイヤー) は、送信のためにデータをバイナリ ストリームにシリアル化し、データを逆シリアル化して受信することもできますサービス公開プロセス
最初にプロバイダーが開始され、プロキシ エージェントを通じてプロトコルが必要になります。公開されたインターフェイスは、実行可能本体である Invoker にカプセル化され、次に Exporter を通じてパッケージ化されて送信されます。登録センターに送信して登録を完了すると、サービスが公開されます。
#サービス利用プロセス
注: 上の図の青い部分はサービス利用者、緑の部分はサービス利用者です。部分はサービスプロバイダーです。
ProxyFactory
Proxy プロキシ クラスを生成します。プロキシは、Invoker 実行可能オブジェクトを保持します。
invoke を呼び出した後、
Cluster を渡す必要があります。 Directory
からすべての呼び出し可能なリモート サービス呼び出し元のリストを取得します。特定のルーティング ルールが設定されている場合は、呼び出し元リストを再度フィルターする必要があります。
残りの呼び出し元は、
LoadBalance
Monitor# に送信されます。定期的に。 ##。 次に、データ送信には
Client
を使用します。通常は
を使用して送信します。 送信には、
Codec
インターフェイスを介したプロトコル構築、次に
を介したシリアル化が必要で、最後にシリアル化されたバイナリ ストリームが対応するサービス プロバイダー By に送信されます。 <p>バイナリ ストリームを受信した後、サービス プロバイダーもコーデック プロトコル処理を実行し、デシリアライズ (ここでの処理は送信前の処理と対称です) してから、リクエストを処理のためにスレッド プールに入れます。リクエストに従って対応する <code>Exporter
を呼び出し、それを Filter でレイヤーごとにフィルターして Invoker を取得し、最後に対応する実装クラスを呼び出して元の方法で結果を返します。
以上がJavaベースの分散サービスフレームワークDubboの原理と事例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
