導入長い間 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 の間違い
9元でどんなクラウドサーバーが買えますか? ftlcloud は自社の宣伝 (および市場獲得) を目...
高品質のコンテンツから高品質の Web サイトが生まれ、Web サイトのコンテンツの重要性は明らかで...
ここ 2 日間は忙しかったので、Hostus の香港 VPS のレビューを書くために戻ってきました。...
8月6日、テンセントオープンソースアライアンス会長兼テンセントクラウドオープンソースエコシステムゼネ...
有名な質疑応答ソーシャル ネットワーキング サイト Quora に次のような質問があります。 Quo...
クラウド コンピューティング市場にはいくつかの主要ベンダーがあり、Amazon Web Servic...
企業向けでもウェブサイトマーケティング向けでも、ソフトテキストマーケティングは欠かせないマーケティン...
前回の記事では、ドメイン名登録の安全性、適時性、適用性について主に説明しました。ウェブマスターがドメ...
ウェブサイトの重みを向上させることは、オンラインプロモーションの目標の1つです。サイトの最適化や更新...
国内のVPS(クラウドサーバー)はすべて登録が必要です。責任を持って言いますが、登録が不要な国内のV...
多くのソーシャル プラットフォーム開発者は、ポイント、レベル、リーダーボードなどのゲームのようなメカ...
メーデー連休最終日の正午、QQ Spaceチームは「5月2日だけで、QQ Spaceにアップロードさ...
スパムサイトを構築するか、通常のサイトを構築するかは、SEO 界では永遠の話題です。初心者はゴミステ...
Qutoutiao は、新しい形式の情報閲覧を創造することに特化したソフトウェアです。モバイル アプ...
ウェブサイトの SEO に関して、多くの初心者はインターネットで関連情報を無目的に検索します。この人...