質問1:なぜ私たちは、分散にシステムを分割するのですか?なぜ使用のダボ?
1.なぜあなたはシステムを分割したいですか?
-
それは、分割システム、コードの行数十万人の大規模なシステムをしない場合、多くの人が共通のコードは、単に悲劇で維持します。
-
分割後、大規模なシステムは、多くの小さなサービスに分割するために、平均システムも数十コードの行の数千のは、各サービスが単一のマシンに展開され
2.どのようにサービスを分割するには?
システムのほとんどは、オリジナルの複数のモジュールを分割することが可能である第一の時間が開いて分割し、複数のラウンドを分割することです。
しかし、その後、各システムは、各サービス・モジュールを分割、非常に複雑になっている可能性がありますが、またスプリットに進みます。
3.解像度がそれをダボできないのですか?
もちろん、直接SpringMVCに基づいて、様々なシステム間の大きな問題は、純粋インタフェースhttpjを介して互いに通信します。HTTPインターフェース通信メンテナンスがタイムアウト、リトライ、負荷分散やその他の問題を考慮することが高価であるので、しかし、問題は、確かにそこにあります。
我々はしていない、コールへのインターフェイスですが、ダボは、負荷分散を扱う、リモートマシンのネットワークトラフィックとコール要求を委任します、オフラインサービスで自動検出ダボははっきり言った、RPCフレームワークで、ローカルにあるので、タイムアウトの再試行などダボに、それを自分で行います。
質問2:ダボの作品についての話は、レジストリがそれを伝えるために続けることがハングアップ?RPC要求処理についての話?
1.dubbo作品
2.dubbo成層
-
第一層:サービス層、サービスプロバイダーは達成するために必要と消費者
-
第二層:コンフィグ層、層構成、構成ダボの主種々
-
クライアントの生成プロキシ層、サービス剤層、透明スケルトンスタブとサーバー:第三の層
-
第四層:レジストリ層、サービス登録と発見の終わり
-
第五層:クラスタ層、クラスタ層、ルーティングサービスプロバイダパッケージとロードバランシング複数の、複数のサービスインスタンスがAに結合され
-
第6層:モニター層、制御層、通話や通話時間のRPCインタフェースモニタの数に
-
第七層:プロトコル層、リモートコール・レベル、RPC呼び出しをパッケージ化
-
第8層:交換層、情報層の交換、要求応答モードをカプセル化、同期、非同期転送
-
第九層:トランスポート層、ネットワークトランスポート層、網状にミナ抽象的かつ統一されたインタフェース
-
第十層:serilize層、データ層列
2.登録センターがハングアップするためにそれを伝えるために続けることができますか?
登録センターの後にサービスが終了してから初めてのサービスへのクライアントアクセスは、独自のローカルキャッシュになりますので、サーバーへの次の呼び出しが要求登録センターに持っていない、ことが可能であり、したがって、レジストリがハングアップした通信を継続することができます
質問3:通信プロトコルと直列化プロトコルがサポートダボ
1.dubboサポート異なるプロトコル
-
ダボ契約
デフォルトはダボ合意、単一の長いリンクを取ることです、NIO非同期通信
(NIOコミュニケーション論:NIOは、顧客に耳を傾け時に、マルチプレクサを介してネットワークハンドルを監視するための)原子炉パターンが複数のトピックを監視することができますことを除いて、オブザーバーパターンに似た(複数のクライアントを原子炉パターンを採用対応する要求メッセージ、対応する要求メッセージハンドラ(クラスサービス処理)の終了)
適したシーン:データ伝送の少量が、高い同時実行
-
RMIプロトコル
Goが一般的にあまり、ファイルを転送するためのコンシューマとプロバイダの同様の数のため、バイナリシリアル、複数の短い接続をJAVA
-
ヘッセ合意
ヘッセ直列化プロトコル、ショート接続の複数を取り、より多くのファイル転送に適した消費者の数と数、一般的に以下の使用より提供するように適合されています
-
HTTPプロトコル
ゴーJSONシリアライズ
-
ウェブサービス
石鹸テキストシリアライズしてください
質問4:政策戦略のバランスを取るdobboクラスタのフォールトトレランスと負荷?ダイナミックプロキシポリシー?
dobbo負荷分散戦略
1.randomロードバランス
デフォルトでは、ダボは、ランダムな負荷balcanceランダムコールのロードバランシングでは、あなたは一般的に、重みがロードバランシングが続く、流れを、より高い、より大きな重量配分を異なるプロバイダインスタンスごとに異なるアクセス権を設定することで、このデフォルトを使用することができますです。
2.roundrobinのロードバランス
デフォルトでは、均等にトラフィックが各マシンを打つが、各マシンのパフォーマンスが異なる場合、簡単に高すぎるとダウンタイムでマシンの負荷のパフォーマンスの低下につながります。マシンのパフォーマンスはほとんど少ない重量を運ぶように重みを調整するために、このポイントが必要で、
3.leastactiveロードバランス
これは、マシンのパフォーマンスは、マシンあまり要求の貧弱なパフォーマンスが得られます。この時点で、その少数の要求がアクティブで、およそアクティブではない、受信不良である場合には、自動認識であります
4.consistanthashロードバランス
整合性ハッシュアルゴリズムは、特定のプロバイダまで、プロバイダハング時間に割り当てられた同一のリクエストパラメータは、残りの流れが均一に仮想ノードに配布され、ジッタはあまり大きくありません。必要性は、ノードへの要求のクラスにランダムな負荷分散が、ない場合は、この整合性ハッシュ戦略を取ります
dobboフォールトトレラントクラスター戦略
1.failoverクラスタモード
失敗自動切換え、自動リトライ他のマシン、ダボのデフォルトはこの戦略を使用します
2.failfastクラスタモード
すぐに、書き込みに共通する失敗する失敗
3.failsafeクラスタモード
一般ロギングなどのインタフェースコール重要でない、で使用される、無視異常
4.failbackcクラスタモード
障害が発生したバックグラウンド自動録画要求は、送信のタイミング、メッセージキューは、このような場合に適しています
5.fockingクラスタモード
並列呼び出し、複数のプロバイダー限り、すぐに正常に戻ります
6.broadcastクラスタモード
すべてのプロバイダを一つずつコール
動的プロキシポリシーダボ
デフォルトJavassistのバイトコード生成、動的に作成されたプロキシクラス
質問5:あなたは、SPIのメカニズムを理解していませんか?SPIベースのメカニズムはどのように拡張することがダボ?
SPIメカニズム
-
単純に、サービスプロバイダインタフェースを置く;例えば、インタフェースAを持って、今3つのインタフェースの実装クラスを持って、その後、実行時に最終用途でのインタフェースのためのその実装クラスはありますか?これは、中にロードされ、対応する実装クラスを見つけるために、コンフィギュレーションとデフォルトの設定を指定するには、SPI、必要性を必要とし、オブジェクトの後、実装クラス
たとえば、次のようにインターフェースA - >実装クラス実装クラスA1 A2 A3実装クラス
インタフェースの実装クラスA = A2に配置されました
システムが稼働している場合は、A2は、サービスを提供するオブジェクトをインスタンス化実装クラスで、この設定をロードします
-
レッツは、あなたがポートAを持つプロジェクトのデモは、ポートAがプロジェクトで達成されていない持っていると言う - >システムが動作しているとき、どのように実装インタフェースAが行うというクラスを選択するには?
-
あなたはA、メイクにA = com.ultrapower.service。実装クラスA2。Aプロジェクトのインタフェースの実装クラスのインターフェイス、自分でファイル名はインターフェイス名ですのjarパッケージ、ファイルの上に置くMETA-INF /サービス/、取得することができますこのjarパッケージに依存して、システムが動作しているとき、プロジェクトがインターフェイスaに駆け、それはすべてのjarパッケージが自分に依存してスキャンします、各ジャーバッグを探し、何のMETA-INF /サービスフォルダがありませんか?もしそうなら、この名前のインターフェイスAのファイルが存在しない、内側に見えますか?もしそうなら、あなたのバッグ、そのクラスのないインタフェースの実装クラスAの瓶が存在しないで、見て
-
SPIのダボメカニズム
ダボはまた、SPIの考えを使用しますが、自分自身のSPIを実現するためのメカニズムを、SPI jdkのメカニズムをされて使用していませんでした
1つのプロトコルプロトコル= ExtensionLoader.getExtensionLoader(プロトコル。クラス).getAdaptiveExtension()
-
プロトコル・インタフェース、システムが動作しているとき、どれがそれを使用するオブジェクトをインスタンス化するために、この議定書のインタフェースの実装クラスに使用されるべきかを決定するためにダボ必要?
-
彼は、あなたが提供するプロトコル・インタフェース・クラスを使用しますあなたの設定は、過去にJVMにロードされ、その後、オブジェクトをインスタンス化されたプロトコル、それは希望プロトコル実装クラスを設定、検索します
-
マイクロカーネルは、プラグイン可能な、RPCコールを担当する成分が多く、議定書は、あなたが議定書のインタフェースを実現するために、独自のRPCコール・コンポーネントを実装することができ、あなた自身の実装クラスを与えることができます
-
このラインは広くダボで使用され、インタフェース及び複数の実装を保持し、その後、動的に構成されていない場合、実行時に対応する実装クラスを見つけるために、構成に基づいて、デフォルトの実装を取るしている、多くのコンポーネントのためのものですクラス。
。1 2 @SPI( "ダボ" ) 。3 パブリック インターフェースプロトコル{ 4 / ** 。5 *、ユーザがポート構成を使用しない場合、デフォルトのポートを得ます。 6 * 7 * @returnのデフォルトポート 。8 * / 9 INT getDefaultPort(); 10 11 / ** 12である *リモート・サービス・露光:<BR> 13は *プロトコル1.要求を受信すると、要求は、発信元のアドレス情報を記録しなければなりません。:RpcContext.getContext()setRemoteAddress(); <BR> 14 * 2.エクスポート()を2回、同じURLの発動にさらされるべき等、である必要があり、露光時間は変わりありません。<BR> 15 * 3.エクスポート()実行者は、合意が心配する必要はありません、着信フレームとパスで実装されています。<BR> 16 * 17 * @param <T>サービス・タイプ 18である * @param 実行サービス呼び出し 19 * @return 輸出露光キャンセルするためのサービス参照を露出し 20である * @throws 露出サービス、そのようなポートがある場合、エラーがスローされたときにRpcException占め 21がある * / 22である @Adaptive 23である <T>輸出<T>エクスポート(インボーカ<T>呼び出し)がスローRpcException; 24 25 / ** 26である *リモートサービス参照:<BR> 27 * 1.ユーザ呼び出すが参照( )を呼び出す実行者オブジェクトが返される場合)方法()メソッドを、プロトコルは(起動側のオブジェクトを呼び出し(着信遠位エクスポート対応する同じURLを実行する必要がある)を。<BR> 28 * 2は、(参照)インボーカが実装されたプロトコルによって返され、プロトコルは、典型的には、この起動側で遠隔送信要求を必要とします。<BR> 29 URLがセットチェック=偽を持っている場合* 3、接続はスローされませ失敗し、内部の自動復旧。<BR> 30 * 31れる * @paramのタイプ<T>とサービス 32 * @paramのサービス・タイプのタイプ 33は、 * @param URLリモートサービスのURLアドレス 34がある * @return 呼び出しローカルプロキシサービス 35 * @throws 場合、接続サービスRpcExceptionプロバイダに障害が発生した例外 36 * / 37 [ @Adaptive 38である <T>インボーカ<T> REFER(クラス<T>型、URL URL)スローRpcExceptionを、 39 40 / ** 41 *リリース契約:<BR> 42 * 1契約が露出し、サービスへのすべての参照されているキャンセル。<BR> 43 リリースにすべてのリソース* 2.契約は、このような接続やポートなど、占領しました。<BR> 44 放出時* 3。契約は、まだ公開し、新しいサービスを参照することができました。<BR> 45 * / 46である ボイド)(破壊; 47 48 }
ダボ自身の瓶には、META-INF /ダボ/内部/ com.alibaba.dubbo.rpc.Protocolファイルで
ダボ= com.alibaba.dubbo.rpc.DubboProtocol
HTTP = com.alibaba.dubbo.rpc.HttpProtocol
ヘッセ= com.alibaba.dubbo.rpc.hessianProtocol
すべてが、これは実際には、プロトコル・インタフェース、SPI @(「ダボ」)は、デフォルトのキー、設定などの設定ファイルにダボを見ているクラスを実装するためのSPI機構を介して実装クラスを提供することであると言い、ダボデフォルトの設定である、と述べました以下のようなダボによるキーとしてファイル名のフルパス名とインターフェースの名前は、デフォルトの実装クラスがcom.alibaba.dubbo.rpc.DubboProtocolで見つけることができるとき
デフォルトのネットワーク通信プロトコルダボ、プロトコルは、ダボ、あるDubboProtocol
あなたが@Adapterインタフェース、プロトコル・インタフェースを使用し、デフォルトの実装クラスのダイナミックを交換したい場合は、両方のインターフェイスがプロキシ実装されているということであるコメント@Adapterを追加するには2つの方法があります。
例えば:このプロトコルインタフェースは、実行時に、メソッドをマークし、両方の@Adapterノートを従事する、それは議定書、動的URLに基づいたときに、プロキシコードは、エージェントコードが実行される2つのプロキシクラスのメソッドのプロキシクラスを生成しますプロトコルは、キーを取得するには、デフォルトはダボで、あなたはまた、独自の他のキーを指定することができ、それが実装クラスの別のインスタンスを取得します。
異なるパラメータのURL、さまざまなコンポーネントが実装クラスを使用して動的に制御することができます
質問6:ダボベースのサービス管理、サービスの低下、故障の再試行タイムアウトと再試行を行う方法は?
1.サービスマネジメント
1.通話リンク生成
サービスコンポーネントの多数から成る大規模な分散システム。どのようにこれらのサービスの間には、それを呼び出すことですか?通話リンクが有効なのですか?
それは、あなたが見ることができ、自動的に記録された各種サービス間の分散システムダボベースの呼び出しを行う必要があり、その後、自動的にさまざまな依存関係をリンクし、サービス生成を呼び出し、マップを作っただろう
2.サービスアクセス圧力と時間の統計情報
自動統計訪問し、各インターフェース間の遅延を呼び出すだけでなく、2つのレベルに分割されます。第2のレベルは光源から入射され、要求の完全鎖;粒度のレベルはインターフェースであり、インターフェースは、各サービスの量は、TP50、TP90、TP99、遅延された要求の数の3つの段階、と呼ばれる毎日回数でありますロードサービスの数十の後、何度も行くために要求、一日フルリンクを完了し、全体のリンク要求遅延TP50、TP90、TP99
どのくらいありますか?
これらの事を取得した後、背後にある場合にのみ、現在のシステムの圧力を表示するには?どのように展開し、最適化しますか?
その他3。
可用性の監視サービス成層(循環依存を避けるため)、コールモニタリングとアラームリンク失敗、認証サービス、各サービス
2.サービスが格下げ
こうしたサービスB、サービスBハング結果としてコールサービスは、いくつかの再試行がサービスAサービスBを呼び出すか、直接分解されない、予備のロジックを取り、ユーザーに応答を返します
質問7:冪等分散サービス・インターフェースがどのように設計するには?
何度も開始する要求とのインターフェースである、いわゆる冪等は、このインターフェイスの結果は、これ以上の控除として、正確であることを確認する必要があり、複数のデータを挿入することができない、統計は1以上を支払うことはできません。これは冪等です。
次のことを確保するための手段の冪等:
-
各要求は、グローバル一意識別子を持たなければならないために
-
各要求が処理された後、要求を特定のレコードが存在する必要があり、そのような共通のプログラムとして完成処理は、そのような唯一のキーとして水を使用して、レコード順の支払い、および有料受注を支払う前に水を実行しているとして、どのような状態のmysqlに記録されています。彼らは、実際のお支払い料金を実行する前にのみ成功した水の支払いを挿入。
-
毎回それは、例えば、以前に処理された論理処理か否かが判断される要求のニーズを受けて、支払われた注文がある場合、既に、インサートを支払うために、この時点で、送信要求が繰り返され、次いで場合、水の流れを支払いましたしかし、受注有効に存在する、ユニークキー制約になっている、エラー挿入が失敗し、その後、あなたはデビットカードを持っていません
-
一般的な生産は冪等をRedisのことを確実にするために設定することができます
質問8:ダボのRPCに似たフレームワークを設計する方法
シンプルなアイデアを櫛:
-
登録するには、レジストリサービス上に置いて、あなたは飼育係で行うことができます、レジストリ、各予約サービスアドレス情報を持っている必要があります。
-
消費者は、各サービスは複数のマシンに存在する可能性、サービスのレジストリ情報を拾う行きます
-
そして、あなたはそれを送信する方法の点で要求を開始しますか?動的プロキシに動的エージェント指向のインターフェースに基づいて取得し、プロキシは、プロキシローカルダイナミックインターフェースは、次に代理店がマシンを対応するサービスアドレスを検索し、あります
-
その後、たとえば、あなたがランダムローテーション学習アルゴリズムを使用することができ、ここでロードバランシングアルゴリズムがあるでしょう?リクエストを送信するためにどのマシンを見つけます
-
彼に送信する方法、機械を探しますか?ネッティー、NIO道、2番目の質問センドどのような形式できますか?フォーマット、またはシーケンスフォーマットかもしれJSON
-
そこからサービスが、あなたのサービスの必要性は、それがサービスメソッドのローカルエージェントでは、あなたのローカルエージェントのサービスコード、要求が受信され、ネットワークポートをリッスンし、動的なプロキシを生成します。