序文
道の七十%に60の自由時間を利用今週、。メイン文書ダボ公式サイトとネイティブコードのデバッグはまだ、ルーティング辞書やその他の機能が含まれ、サービスの輸出、サービスの導入とプロセスのサービス呼び出しを読んで基本的な学習コンバイン。櫛を合計する今週の収穫を次に示します。
まず、輸出ベースのイベント駆動型サービス
リフトサービスの輸出は、その名前は、露出し、登録サービスされた人気のポイントを誤解してはなりません。このサービスは、オープン露出が最終消費者が接続するのを待って、ポートのサービス側を指しています。レジストリへの今後のサービス登録情報の登録サービス。露出やサービス登録のための具体的な手順は、記事が前にブロガーも見 https://www.cnblogs.com/zzq6032010/p/11275478.htmlは 、より詳細な情報を伝え、それは詳細には触れません。
ダボは、露出の仕方に注意を払うために、サービス登録プロセスの使用を開始する時間であるイベント駆動型やや似SpringBootで、トリガを。これは、方法の特定のイベント駆動型論理によってトリガされ、また、実際の開発作業に柔軟に使用することができます。
第二に、サービスを導入し、SPIされます
ダボ適応拡張のためのSPI、ブロガーの前の記事を参照してください https://www.cnblogs.com/zzq6032010/p/11219611.htmlが、この記事では、まだ全体を実現していない、比較的簡単かつ明白に書かれていました。
プロトコルクラス以下の例のように、ServiceConfigクラスのメンバ変数プロトコルプロトコル見= ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()ルックスのように。
1つの パッケージorg.apache.dubbo.rpc。 2 インポートorg.apache.dubbo.common.extension.ExtensionLoader。 3 パブリック クラス議定$適応実装org.apache.dubbo.rpc.Protocol { 4 5 公共 のボイド破壊(){ 6 スロー 新にUnsupportedOperationException(「メソッドpublic抽象無効org.apache.dubbo.rpc.Protocol.destroy()のインタフェースorg.apache.dubbo.rpc.Protocolは、適応方法ではありません「! )。 7 } 8 9 公共 のint getDefaultPort(){ 10 投 新UnsupportedOperationException( "インターフェースorg.apache.dubbo.rpc.Protocolのメソッドpublic int型抽象org.apache.dubbo.rpc.Protocol.getDefaultPort()は適応的方法ではありません!" ); 11 } 12 13 公衆 org.apache.dubbo.rpc.Exporterエクスポートが(org.apache.dubbo.rpc.Invoker arg0に)スローorg.apache.dubbo.rpc.RpcException { 14の 場合(arg0に== NULL)スロー 新しい(、IllegalArgumentExceptionを"org.apache.dubbo.rpc.Invoker引数== nullの" ); 15 場合(arg0.getUrl()== nullが)スロー 新しいです例外:IllegalArgumentException( "org.apache.dubbo.rpc.Invoker引数のgetURL()== nullの" ); 16 org.apache.dubbo.common.URL URL = arg0.getUrl()。 17 ストリングEXTNAME =(url.getProtocol()== NULL "ダボ"?:url.getProtocol()); 18 もし(EXTNAME == nullの)スロー 新しい IllegalStateExceptionが( "URLから拡張子(org.apache.dubbo.rpc.Protocol)名の取得に失敗しました(" + url.toString()+ ")使用キー([プロトコル])" ); 19 org.apache.dubbo.rpc.Protocol拡張=(org.apache.dubbo.rpc.Protocol)ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol。クラス).getExtension(EXTNAME)。 20 リターンextension.export(arg0に)。 21 } 22 23 公衆 org.apache.dubbo.rpc.Invokerが参照(のjava.lang.Class arg0に、org.apache.dubbo.common.URL ARG1)はスローorg.apache.dubbo.rpc.RpcException { 24の 場合(ARG1 = = nullの)スロー 新しい例外:IllegalArgumentException( "URL == nullのを" ); 25 org.apache.dubbo.common.URL URL = arg1に。 26 ストリングEXTNAME =(url.getProtocol()== NULL "ダボ"?:url.getProtocol()); 27 もし EXTNAME(==ヌル)スロー 新しい IllegalStateExceptionが( "URLから名拡張子(org.apache.dubbo.rpc.Protocolの取得に失敗しました)(" + url.toString()+ ")使用キー([プロトコル])" ); 28 org.apache.dubbo.rpc.Protocol拡張=(org.apache.dubbo.rpc.Protocol)ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol。クラス).getExtension(EXTNAME)。 29 リターンextension.refer(arg0に、ARG1)。 30 } 31 32 公衆java.util.ListにするgetServers(){ 33 投 新UnsupportedOperationException(「インターフェースorg.apache.dubbo.rpc.Protocolの方法の国民は、デフォルトのjava.util.List org.apache.dubbo.rpc.Protocol.getServers()適応方法ではありません!」); 34 } 35 }
これは、最初の初期化ServiceConfig取得プロトコルに見られるgetAdaptiveExtension()プロキシクラスは、唯一のプロキシプロトコルクラスであり、その後のURLプログラムに渡すことによってプロトコルの実装クラスが実行される特定の使用を決定するために、後に得られます。これは、SPI適応拡張の本質です。
また、getExtension最終的な実装クラスメソッドにより取得時だけでなく、包装ラッパークラスを介し。次のようにExtensionLoaderクラスを参照してください。
1 プライベートT createExtension(文字列名){ 2 クラスclazz = <?> getExtensionClasses()(名前)を得ます。 3 であれば(clazz == NULL ){ 4 スローfindException(名); 5 } 6 トライ{ 7 Tインスタンス= (T)EXTENSION_INSTANCES.get(clazz)。 8 あれば(例えば== NULL ){ 9 EXTENSION_INSTANCES.putIfAbsent(clazz、clazz.newInstance())。 10 インスタンス= (T)EXTENSION_INSTANCES.get(clazz)。 11 } 12 injectExtension(インスタンス)。 13 セット<クラス<>> wrapperClasses =?cachedWrapperClasses。 14 であれば(CollectionUtils.isNotEmpty(wrapperClasses)){ 15 用(クラス<?> wrapperClass:wrapperClasses){ 16 インスタンス= injectExtension((T)wrapperClass.getConstructor(タイプ).newInstance(インスタンス))。 17 } 18 } 19 initExtension(インスタンス)。 20 リターン・インスタンス。 21 } キャッチ(ThrowableをT){ 22 スロー 新しい IllegalStateExceptionを( "拡張インスタンス(名前:" +名+ "を、クラス:" + 23 種類+ ")はインスタンス化できませんでした:" + t.getMessage()、T); 24 } 25 }
インターフェースラッパー、ラッパークラスのライン16の処理がある場合、現在のクラスのインスタンスは、パッケージをカプセル化し、次いで包装のインスタンスを返す、すなわち、拡張クラスのコード行によって実現デコレータの変換。
ここでは同じくプロトコルのクラスは、例えば、URLが合意レジストリにあるので、私は最終的に、このような輸出RegistryProtocolパスにする場合、実行スタック方式と呼ばれます:
すなわち、3つの中間ラッパー包装した後、それぞれが独自の特定の機能を有し、かつ独立して層間の互いの。多くの適応インタフェースに加えて、この拡張機能のような装飾でダボの拡大、プログラムのスケーラブルな設計にもこの方法を再生することができ、興味深いです!
インボーカパッケージ化レジストリサーバから取得した消費者側情報を、その後、消費者側プロキシクラス噴射Springコンテナにパッケージ化:プロセスは、一般的にそうサービスに導入されます。このプロセスは、自己のデバッグの1の内容に応じて、比較的簡単です。
3つの質問、サービスコール
サーバー側のターゲットクラスを呼び出す方法、ダボ消費者側プロキシクラスの消費が過去にメッセージを送ることネッティーである場合に、サーバ側のインタフェースを呼び出すために、サービス終了のニュースを受け取った後:必ずは前に質問ダボのソースを見ていなかった時間を過ごしました方法?それを反映?あなたは、反射法に呼び出すことができますが、依存関係の問題を解決することはできませんが、Springコンテナを終了するには、通常のサービスコールはまた、網状のニュースで春内のオブジェクトを見つける方法で、クライアントの良い例を持っている必要がありますか?
サービスは、サービスが、メッセージの上に、十分な時間と他の消費者エンドパスを保存取るためにマップの内部に直接行くために自分自身を公開するときに露出されている限り、ダボ、実際のプロセスは、非常に単純ですが、春にカプセル化されたサービスオブジェクトを取ることです、非常に簡単。
サービスコールプロセスは、一般的に、このです:リモートクライアントのサーバーへの呼接続、保守サービスの露出マップのサーバ側の後、輸出を取得するサービスマップを終了する要求を受信した後、輸出サーバは、実行をカプセル化しています、豆春に開催されたサービスは、最終的にコールを完了します。中級はさらに、そのようなパッケージとコールネッティー、デシリアライズシーケンス、負荷分散とフォールトトレランスなどの多くの詳細を、関係します。
概要
シリアルプロセス、スレッドのスケジューリングの負荷分散、フォールトトレランス、ネッティー、ルーティング、辞書などのモジュールと拡張性の高いデザインを実現するためのより多くのRPCプロセスより、だけでなく、より詳細にに優れたフレームワークとしてダボRPCサービス、その利点の嘘...後でに関する研究の4つのロードバランシングアルゴリズムのダボのために何をするつもりコンテンツの多く、少し、不注意!