誰がRPCフレームワークが何であるかを簡単な言葉で説明することができますか?

著者:香港Chuntaoの
リンクします。https://www.zhihu.com/question/25536695/answer/221638079
出典:ほとんど知っている
著者が著作権を保有。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

、強力な答えの波を招待していません。私たちは原則についてお話しましょう。ローカルプロシージャコールRPC同じ曲リモート関数へのローカル呼び出しとして機能します。研究RPC前に、我々は、ローカルコールのどの調子を見てみましょう。(int型のL、INT R&LT)我々は:. 1つの整数乗算の結果左辺値*右辺値を計算する関数乗算をコールしたいと{
2 INT Y = L * R<
3リターンY;
4}
5。
6 int型の左辺値= 10;。。
。7 INT右辺値= 20であり、
8 = INT l_times_r乗算(左辺、右辺値。)
次いで、8行目は、我々が実際に次の操作行います乗算関数値に左辺及び右辺プッシュ、行rを実行するためのコードのスタック10と抽出20、付与さl 2の値は、Lは、算出します* R、及びスタックにY Yの存在の結果、及びその後上記ローカルプロシージャコールl_times_r行うステップ5に乗算ライン8、スタック200から抽出された戻り値、および割り当てを返します。(20190116注:上記の手順は原理を単に例示であり、あまり直接的であっても必要性を飛び出るのプロセスをプッシュする必要がなく、レジスタに格納した場合の実際のコンパイラの最適化、パラメータや戻り値で行います。コールに呼び出しますが、直接インライン操作を行います。ファーの原則、この5ステップは問題ではありません。)リモートプロシージャコールリモートコールに新たな問題をもたらした、我々は関数本体がリモートマシン上で実行する必要がありますそれは、乗算は別のプロセスで実行されています。コールIDマッピング:これは、いくつかの新たな問題をもたらします。私たちは、リモートマシンの乗算ではなく、追加またはFooBarのそれを呼び出すために持っているかを教えてください?ローカル呼び出しでは、関数本体を直接関数ポインタで指定されている、我々は乗算を呼び出し、コンパイラが自動的に私たちは、適切な関数ポインタを呼び出すのに役立ちます。両方のプロセスのアドレス空間が完全に異なっているので、しかし、長距離通話で、関数ポインタは、十分ではありません。だから、RPCに、すべての機能は、独自のANのIDを持っている必要があります。このIDは、すべてのプロセスで唯一の確実性です。クライアントのリモートプロシージャコールを作るとき、あなたはこのIDを含める必要があります。< - >その後、我々はまた、{機能を維持するために、それぞれ、クライアントとサーバーが必要 コールID}の対応表。両方のテーブルは必ずしも同一である必要はなく、対応するコールIDと同じ機能は同じでなければなりません。クライアントがリモート呼び出しを必要とするとき、それは適切なコールIDを見つけ、この表を確認し、サーバーに渡します、サーバーは、ルックアップテーブルを、適切なを実行し、コールへのクライアントのニーズの機能を決定するために機能コード。シリアライズとデシリアライズ。パラメータは、リモート関数に渡されたどのクライアント?市内通話では、我々はただスタックに引数を必要とし、その後、自分がライン上にスタックを読み取るための機能を手放します。しかし、リモート・プロシージャ・コールでは、サーバとクライアントがないパスパラメータにメモリを介し、異なるプロセスです。そして、時にはクライアントとサーバは(例えば、サーバー側での使用のPythonとC ++、またはJavaクライアントとして)同じ言語を使用していません。私たちは、クライアントの最初の引数を配置する必要があり、この時間は、彼らが読むことができる形式に、サービスの終了後に渡されたバイトストリーム、バイトストリームに変わりました。このプロセスは、シリアライズとデシリアライズと呼ばれています。同様に、サーバから返された値はまた、直列化逆シリアル化プロセスを必要とし得ます。ネットワーク伝送。長距離通話は、多くの場合、ネットワーク上で使用され、クライアントとサーバがネットワークを介して接続されています。すべてのデータはネットワークを介して送信される要求されているので、ネットワーク・トランスポート層の必要性があります。ネットワークトランスポート層のコールID後のパラメータバイトへのニーズと、サーバにシリアル化ストリーム、およびクライアントにシリアライズされた結果の裏を呼び出します。限りの両方を完了することができるように、それが輸送層として用いることができます。したがって、実際には、伝送線路を完了するために、プロトコルが限定されるものではなく、使用します。ほとんどのRPCフレームワークは、TCPプロトコル、UDPが、実際に缶を使用し、gRPCは単にHTTP2を使用していますが。Javaのネッティーも、物事のこの層に属しています。これら三つのメカニズムでは、RPCは、次のように特定のプロセスがある達成することができるようになります://クライアント側 IDパラメータバイト直列化した後、サーバに渡され、その後、クライアントに、その後連載バックの結果を呼び出します。限りの両方を完了することができるように、それが輸送層として用いることができます。したがって、実際には、伝送線路を完了するために、プロトコルが限定されるものではなく、使用します。ほとんどのRPCフレームワークは、TCPプロトコル、UDPが、実際に缶を使用し、gRPCは単にHTTP2を使用していますが。Javaのネッティーも、物事のこの層に属しています。これら三つのメカニズムでは、RPCは、次のように特定のプロセスがある達成することができるようになります://クライアント側 IDパラメータバイト直列化した後、サーバに渡され、その後、クライアントに、その後連載バックの結果を呼び出します。限りの両方を完了することができるように、それが輸送層として用いることができます。したがって、実際には、伝送線路を完了するために、プロトコルが限定されるものではなく、使用します。ほとんどのRPCフレームワークは、TCPプロトコル、UDPが、実際に缶を使用し、gRPCは単にHTTP2を使用していますが。Javaのネッティーも、物事のこの層に属しています。これら三つのメカニズムでは、RPCは、次のように特定のプロセスがある達成することができるようになります://クライアント側
// int型l_times_r =コール(SERVERADDR、乗算、左辺値、右辺値)

  1. このコールは、コールIDにマップされます。これは、想定されたときに、最も簡単なメソッド呼び出しのIDを持つ文字列
  2. コールID、左辺値と右辺値のシリアル化。それらの値を直接バイナリ形式でパッケージ化することができます
  3. 2.ネットワークトランスポート層の使用を必要とSERVERADDR、取得したデータパケット
  4. 結果を返すようにサーバーを待ち
  5. サーバーの呼び出しが成功した場合、その結果は、デシリアライズ、および譲受人されますl_times_r

//サーバー側

  1. 、ローカル機能コールIDマップcall_id_mapへのポインタを維持することができますはstd ::マップ<はstd ::文字列、のstd ::関数<>>
  2. リクエストを待っています
  3. コールIDを与えるデシリアライズするために要求パケットを取得した後
  4. 見ることによって、対応する関数ポインタを与えるcall_id_map
  5. 左辺値と右辺値がローカル呼び出しで乗算機能をデシリアライズされた後、結果が得られ
  6. クライアントにネットワークによって返される結果のシーケンスの後
    RPCフレームワークを達成するため、実際には、単に基本的に完成を達成するために上記のプロセスを押してください。前記コールIDマッピング関数文字列を直接使用することができる、あなたはまた、整数IDを使用することができます。一般的なマッピングテーブルは、ハッシュテーブルです。シリアル化、逆シリアル化は、独自に書くことができ、あるいは、あなたは次のようにいるProtobufのFlatBuffersを使用することができます。図書館は、独自の伝送ネットワークソケットを作成するなど、ASIO ZeroMQ、ネッティーして使用することができます。もちろん、細部のいくつかは、どのようにフロー制御などない、攻撃を防ぐためにどのように、そのようなネットワーク・エラーに対処する方法として、充填することができるもあります。しかし、追加持続させることができる以上のアーキテクチャ、と。最後に、私たちは、RPCは非常に良好であるため、それがどのように機能するかを理解し、小さいながらも優れたRPCライブラリtinyrpc(hjk41 / tinyrpc)で、自分自身の興味の缶を見ています。
公開された26元の記事 ウォンの賞賛0 ビュー8158

おすすめ

転載: blog.csdn.net/lynchyueliu/article/details/104940636