導入長い間 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 の間違い
サーバー仮想化は、過剰なサーバー リソースの消費を抑え、コンピューターのパワーをより有効に活用し、エ...
A5ウェブマスターネットワーク(admin5.com)は3月26日、多くのネットユーザーやウェブマス...
正直に言うと、4399ミニゲームプロダクトマネージャーのYin Jinqian氏の「大規模なキーワー...
さまざまな業界の企業が、デジタル変革の一環として、あるいは増大する需要に対応するために構築される高価...
三国時代には三つの勢力が対立していたと言われており、『三国志演義』は歴史上の最高傑作です。しかし今、...
【ゼロからのスタート】 2003 年には、QQ や NetEase Bubble などのインスタント...
1. ヤフーが今夏、広告テクノロジー企業AppNexusの株式を取得する計画があると噂されている。海...
多くの人がオンラインで映画リソースを探すとき、まず映画の評価を見て、それから比較的評価の高い映画を選...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスウェブサイトのBaidu...
5G、クラウドコンピューティング、VR、AR技術の急速な発展により、クラウド展示会は主要展示会の「寵...
「マリオ」や「テトリス」の初期の時代から、今日の人気の「原神」まで、世界のゲーム業界は過去 70 年...
Docker テクノロジがより多くの人々に認知されるにつれて、その適用範囲はますます広がっています。...
概要:WeChatパブリックプラットフォームは昨日、「WeChatストア」を正式に開始しました。We...
profvds は現在、主にスロバキアの VPS サービスを提供しています。デフォルトでは、ポート ...
これはBaidu統計に関する記事です。ウェブサイト運用関連の分野で働く人であれば、誰でもウェブサイト...