한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. 基本
1.1 定義と特徴
RPC、リモート プロシージャ コール、リモート プロシージャ コール。あるマシン上のプログラムが別のマシン上のサブルーチンを呼び出す動作を定義します。
特徴:
- リモート実装をローカルに移動しました。実質的に、リモート呼び出しとローカル呼び出しの間に違いはありません。
- cs モードを使用すると、クライアントはリクエストを開始し、サーバーはリクエスト パラメータを受信した後にそれを実行します。
- クロスプロセスおよびクロスネットワーク呼び出しの根底にある複雑さをシールドすることで、ビジネス ロジックにより集中できるようになります。
1.2 具体的な実施枠組み
- dubbo(apache alibaba java)
- モタン(微博)
- tars (Tencent 内部)
- grpc
- 倹約
- 春の雲オープンフェイン
1.3 応用シナリオ
クロスネットワーク通信に使用可能
2. RPC の技術的なポイントと RPC プロセスの 1 回の呼び出し
2.1 RPC プロセス
プロセス


- クライアントはインターフェイスを呼び出してプロキシ クラスに移動し、リクエストを組み立ててシリアル化し、プロトコルをエンコードして送信します。
- サーバーはリクエストを受信し、プロトコルの解析と逆シリアル化を実行してリクエスト パラメータを取得します。
- サーバーはリクエストパラメータに基づいてインターフェース実装を呼び出し、レスポンスを組み立てます。
- レスポンスも同様に返されます
2 つのネットワーク モジュールはどのように接続されていますか?

登録センターはデータが保管される場所であり、監視機能を提供するのが最善です。登録センターは RPC フレームワークから分離されています
共通登録センター: Zookeeper、nacos、etcd
その他の機能

- ルートフィルター利用可能なプロバイダー
- 負荷分散: 利用可能なプロバイダーから使用するプロバイダーを選択します
- ヒューズ制限: フロー制御
- ネットワーク処理
- プロトコル処理
RPC の利点
- 分散アプリケーションの構築、サービスの分離、拡張が容易になります。
- RPC は通常、長い接続を使用するため、通信ごとに接続を確立する必要がなくなり、ネットワークのオーバーヘッドが軽減されます。
- RPC には、サービスの変更を動的に感知して視覚化できる登録センターが必要です。
- 豊富なバックグラウンド管理機能、インターフェースサービスの一元管理、発信者を意識しない、統一操作
- 合理化されたプロトコル、より高い効率、高いプライバシーとセキュリティ
- 負荷分散、サーキットブレーカー、電流制限などの機能があります。
2.2 シリアル化技術
- あらゆるシリアル化フレームワーク: 中心となるアイデアは設計ですシリアル化プロトコル,オブジェクト タイプ、属性タイプ、および属性値を固定形式でバイナリ バイト ストリームに書き込み、シリアル化を完了します。, そして、オブジェクトの型、属性の型、属性値を決められた形式に従って一つずつ読み出し、その情報をもとに新しいオブジェクトを再作成することで逆シリアル化が完了します。
シリアル化方法
- JDKネイティブシリアル化
- 軽量テキストデータ交換形式 - json/XML
- 可読性が高く、多言語サポートによるシリアル化後のバイト ファイルは比較的大きく、比較的非効率ですが、シリアル化後のバイト ストリームは企業で広く使用されています。特にフロントエンドとサードパーティが API を提供します。
- ヘッセンこれは動的型のバイナリであり、クロス言語の Xu Lihua フレームワークをサポートしています。
- ヘシアンのパフォーマンスは、JDK や JSON のシリアル化よりもはるかに効率的です。また、生成されるバイト数も少なくなります。非常に優れた互換性と安定性,したがって、ヘシアンは、RPC フレームワークでのリモート通信のシリアル化プロトコルとしてより適しています。
- プロトコルバッファ
- Google が発表したオープンソースのシーケンス ライブラリは、多言語をサポートする軽量で効率的な構造化データ ストレージ形式です。
- 高速、高圧縮率、小さいサイズ。シリアル化後のボリュームは JSON やヘシアンよりもはるかに小さく、拡張性、アップグレード性、互換性が高く、下位互換性があります。
PRC はシリアル化フレームワークをどのように選択しますか?
- 選択要因
- セキュリティ: 最初に考慮すべきことは、シリアル化にセキュリティの脆弱性がある場合、オンライン サービスが侵入される可能性があるということです (JDK ネイティブのシリアル化には脆弱性があります)
- 互換性: バージョン アップグレード後のシリアル化プロトコルの互換性は、クロスプラットフォーム、クロス言語などにかかわらず、非常に良好です。
- 汎用性: 任意の型をシリアル化および逆シリアル化できます。サーバーは、特定の型のパラメーターを追加した後、突然サービス インターフェイス メソッドを呼び出せなくなることはありません。
- パフォーマンスと効率: シリアル化と逆シリアル化のプロセスは、RPC 呼び出しに必要なプロセスです。パフォーマンスと効率は、RPC フレームワークの全体的なパフォーマンスと効率に直接関係します。
- スペース オーバーヘッド: シリアル化後のバイナリ データのサイズ。シリアル化されたバイト データのサイズが小さいほど、ネットワーク上で送信されるデータの量が少なくなり、データの送信が速くなります。これは、RPC 要求の呼び出しに直接関係します。反応時間
考慮事項
- 構築するには複雑すぎて、多くの属性があり、複数レベルのネストがあるオブジェクトは避けてください。
- 大きすぎるオブジェクト(大きな文字列、非常に大きな配列など)は避けてください。
- シリアル化フレームワークでサポートされていない型をパラメーターとして渡すことは避けてください。
- オブジェクトが複雑な継承関係を持つことを防ぐ
2.3 アプリケーション層通信プロトコル - http
2.3.1 基本概念
ほとんどの RPC は独自に http を開発しており、http1.1 もサポートしています。

IOとは何ですか
IO は、内部コンピュータと外部デバイスの間でデータをコピーするプロセスです。
ネットワーク データが到着すると、まずオペレーティング システムのカーネル キャッシュ領域に保存され、アプリケーションが収集するのを待ちます。
エッジトリガー
エッジ トリガー モードを使用する場合、監視対象のソケット記述子で読み取り可能なイベントが発生すると、プロセスが読み取り関数を呼び出してカーネルからデータを読み取らなくても、サーバーは epoll_wait から 1 回だけウェイクアップします。したがって、プログラムはカーネル バッファ内のデータが一度に読み取られるようにする必要があります。
水平トリガー
水平トリガー モードを使用する場合、監視対象のソケットで読み取り可能なイベントが発生すると、カーネル バッファー データが読み取り関数によって読み取られるまで、サーバーは継続的に epoll_wait からウェイクアップします。その目的は、読み取られる必要のあるデータがあることを通知することです。読む。 。
イベント駆動型 IO
読み取りリクエストを開始した後、データを読み取る前に読み取り準備完了イベント通知を待ちます。
非同期IO
読み取りリクエストを開始した後、読み取りの完了後にオペレーティング システムが通知するのを待ち、実装のために機能をオペレーティング システムに完全に渡します。
2.3.2 オペレーティング システムの IO モデルは何ですか?
同期ブロッキング IO
同期ノンブロッキング IO
IO多重化
信号駆動型 IO
非同期IO

同期ブロッキング IO
読み取りの最初の段階がブロックされます。これをブロッキング IO と呼びます。つまり、読み取りの準備が完了するのを待って読み取りの最初の段階がブロックされる場合、それをブロッキング IO と呼びます。
listenfd = socket();
bind(listenfd);
listen(listenfd);
while(1) {
connfd = accept(listenfd);
int n = read(connfd, buf);