導入長い間 Java を使ってきた開発者のほとんどは、gRPC に触れることはほとんどないと思います。結局のところ、Java 界隈で使用されているサービス フレームワークのほとんどは Dubbo/SpringClound です。 私も最近、ビジネスをゼロから再構築する機会があり、gRPC と出会いました。 gRPC を選択した理由はいくつかあります。
オンラインで 1 年以上安定して運用されてきた結果、gRPC は依然として非常に安定しており、効率的であることがわかります。 rpc フレームワークの中核となるポイントは次のとおりです。
これらは以下に対応します:
HTTP/2gRPC を学習する前に、まず gRPC がどのようなプロトコルを介して通信するかを知っておく必要があります。私たちの日常的な開発やアプリケーションでは、基本的に HTTP/1.1 プロトコルに最も多く触れます。 HTTP/1.1 はテキスト プロトコルであるため、人間にとっては非常に使いやすいですが、マシン上でのパフォーマンスは比較的低くなります。 テキストを繰り返し解析する必要があるため、効率は当然低くなります。よりマシンフレンドリーにするにはバイナリを使用する必要がありますが、これは HTTP/2 によって自然に実現されます。 他にも利点があります:
プロトコルgRPC は、gRPC より前にリリースされたプロトコル シリアル化を使用します。したがって、gRPC だけでなく、シリアル化された IO 操作を必要とするあらゆるシナリオで使用できます。 より省スペースで高性能になります。 https://github.com/crossoverJie/cim の開発時にデータのやり取りに使用されました。 パッケージ順序.v1 ; 使い方も非常に簡単です。独自の .proto ファイルを定義するだけで、コマンドライン ツールを使用して対応する言語の SDK を生成できます。 詳細については、公式ドキュメントを参照してください: https://grpc.io/docs/languages/go/generated-code/ 電話プロトコル--go_out=。 --go_opt=パス=ソース相対\ コードが生成されると、サーバーの作成は非常に簡単になります。生成されたインターフェースを実装するだけで済みます。 func ( o * Order ) Create ( ctx context .Context , in * v1 .OrderApiCreate ) ( * v1 .Order , error ) { クライアントも非常にシンプルで、サーバー コードに依存して接続を作成し、ローカル メソッドを呼び出すだけです。 これは、1 つのリクエストが 1 つのレスポンスに対応する、http のリクエスト/レスポンス モデルに似た、典型的な単項呼び出しです。 サーバーストリームgRPC は、通常の単項呼び出しに加えて、特定のシナリオで非常に便利なサーバー プッシュもサポートしています。 func ( o * Order ) ServerStream ( in * v1 .OrderApiCreate , rs v1 .OrderService_ServerStreamServer )エラー{ サーバーのプッシュ機能は上記に示されています。プッシュ関数を呼び出してクライアントにプッシュすることができます。 のために{ クライアントは、ループ内で現在受信されているデータ パケットが終了したかどうかを判定することによって、サーバー メッセージを取得します。 このプロセスをより直感的に示すために、以前に開発された gRPC クライアントが、ストリーム呼び出しを直感的にデバッグできるように最適化されました。 上の図はサーバープッシュの例です。 クライアントストリームサーバー プッシュのサポートに加えて、クライアントもそれをサポートします。 クライアントは同じ接続でサーバーにデータを送信し続け、サーバーはメッセージを並行して処理できます。 //サーバーコード コードはサーバー プッシュに似ていますが、役割が入れ替わります。 双方向ストリーム同様に、クライアントとサーバーの両方が同時にメッセージを送信する場合もサポートされます。 //サーバー 実際のところ、それは単に 2 つの訴えを 1 つに組み合わせただけです。 例を挙げるとわかりやすいです。 メタデータgRPC は、HTTP のヘッダーと同様に、メタデータの送信もサポートしています。 //クライアントが書き込み gRPC ゲートウェイgRPC は強力で使いやすいですが、ブラウザやアプリのサポートは REST ほど広まっていません (ブラウザもサポートしていますが、アプリケーションは非常に少ないです)。 この目的のために、コミュニティは https://github.com/grpc-ecosystem/grpc-gateway プロジェクトを作成しました。このプロジェクトでは、gRPC サービスを RESTFUL API として公開できます。 テスターがインターフェース テストに postman を使用することに慣れるために、より便利なテストのために gRPC サービスもプロキシします。 リフレクションコールRPC フレームワークとして、サポート ツールの開発を容易にするために、一般化された呼び出しもサポートする必要があります。 gRPC はリフレクションを通じてサポートされており、サービス名と pb ファイルを取得することでリフレクション呼び出しが行われます。 https://github.com/jhump/protoreflect このライブラリは、一般的なリフレクション操作をカプセル化します。 上の図に示されている視覚化ストリーム呼び出しも、このライブラリを通じて実装されています。 負荷分散gRPC は HTTP/2 に基づいて実装されているため、クライアントとサーバーは長時間の接続を維持します。負荷分散は HTTP ほど単純ではありません。 接続ではなくリクエストの負荷分散を必要とする gRPC を使用して、HTTP と同じ効果を実現したいと考えています。 通常、2 つのアプローチがあります。
クライアント負荷分散は、RPC 呼び出しで広く使用されています。たとえば、Dubbo はクライアント負荷分散を使用します。 gRPC は関連するインターフェースも提供します。詳細については公式デモを参照してください。 https://github.com/grpc/grpc-go/blob/87eb5b7502/examples/features/load_balancing/README.md クライアント側の負荷分散は開発者にとって比較的柔軟性が高く (独自の戦略をカスタマイズできます)、開発者自身でロジックを維持する必要もあります。複数の言語がある場合は、複数のコピーを維持する必要があります。 したがって、クラウド ネイティブの一般的なテーマでは、サーバー側の負荷分散を使用することがより推奨されます。 オプションは次のとおりです:
私たちもこの分野を研究しており、おそらく envoy/istio を使用する予定です。 要約するgRPC にはまだ多くのコンテンツがあります。この記事は、gRPC を知らない人に基本的な理解を与えることを目的とした入門文書です。これはまさにクラウドネイティブ時代に必要なスキルです。 この記事の gRPC クライアントに興味のある方は、ここのソース コードを参照してください: https://github.com/crossoverJie/ptg。 |
>>: Kubernetes で絶対にしてはいけない 10 の間違い
年末から来年の初めにかけて、研究機関や業界の専門家は、今後 1 年間のソフトウェア エコシステムの発...
月給5,000~50,000のこれらのプロジェクトはあなたの将来ですA5 Entrepreneurs...
Krypt のクラウド サーバー ブランドである ion では割引プロモーションが頻繁に行われており...
みなさんこんにちは。私は徐子宇です。過去1年間、MeilishuoとMogujieがあまりにも多く私...
クラウド戦略の重要性と複雑さが増すにつれて、クラウド アーキテクトは企業がリスクを回避し、クラウドへ...
今年、Baidu は Green Radish Algorithm 1.0 をリリースし、最近 Gr...
ウェブマスターツール tool.chinaz.com の「ウェブサイトハッキング検出」でウェブサイト...
1. 百度が2012年の年間検索ランキングを発表百度は2012年の年間検索チャートを発表した(htt...
中国で唯一、China Telecom の AS4809 (cn2 gia) に匹敵するネットワーク...
Neosurge は、2002 年から 10 年以上の歴史を持つ小規模な IDC 企業です。社長の ...
InterServer は、アメリカのホスティング会社として定評があります。1999 年に設立されま...
9月12日に「WeChatモーメントマーケティングの5日間の実践ノート」という記事を書きました。...
[[407548]]序文誰もが分散サービスを使用しているため、分散サービスでの同時データ更新の問題は...
最近、多くの友人が、外部リンクの構築を主張する多くのウェブサイトのランキングが実際に下がり、中にはB...
暇な時に、過去数年間の入札経験について簡単にお話しし、皆さんと共有したいと思います。まずフローチャー...