web-dev-qa-db-ja.com

GRPCはRESTとどう違うのですか?

私はこれを読んでいます GRPCの説明 そしてこの図は興味深いです:

enter image description here

トランスポート層はどのように機能しますか?それがネットワーク上にある場合...なぜそれがRPCと呼ばれるのですか?さらに重要なことに、これはサービス層(httpリクエストを行うメソッドを持つクライアントのクラス)のAPIを実装するRESTとどう違うのでしょうか。

78
Jwan622

トランスポート層は、TCP/IPの上でHTTP/2を使用して機能します。これにより、クライアントからサーバーへの単一接続を利用できる低遅延(高速)接続が可能になります(これにより、接続がより効率的に使用され、サーバーリソースがより効率的に使用されるようになります)。

HTTP/2は双方向接続と非同期接続もサポートします。そのため、サーバーがクライアントと効率的に連絡を取ってメッセージを送信することができます(非同期応答/通知など)。

RESTとgRPCはどちらもクライアント/サーバースタブを生成することができます(RESTではswaggerのようなものを使用します)が、RESTには限られた一次 '関数'呼び出し(または動詞)があります。

 + ----------- + ---------------- + 
 | HTTP動詞| CRUD | 
 + ----------- + ---------------- + 
 | GET |読む| 
 | PUT |更新/置き換え| 
 |パッチ更新/修正| 
 | DELETE |削除| 
 + ----------- + ---------------- + 

gRPCでは、同期/非同期、単方向/双方向(ストリーム)など、あらゆる種類の関数呼び出しを定義できます。

GRPCを使用して、クライアントはローカルメソッドを呼び出します。プログラマーにとっては、ローカル呼び出しを行っているように見えますが、基礎となる層(自動生成されたクライアントスタブ)が呼び出しをサーバーに送信します。サーバーにとっては、そのメソッドがローカルに呼び出されたように見えます。

gRPCは、基礎となるすべての配管を処理し、プログラミングパラダイムを簡素化します。しかし、一部の献身的なREST純粋主義者にとって、これは過剰な合併症のように思われるかもしれません。 YMMV

89
mmccabe

RESTはJSONやHTTP/1.1を必要としません

HTTP/2でprotobufメッセージ(あるいは何でも)を送信するRESTfulサービスを自明に構築することができます。

HTTP/2でJSONを送信するRESTfulサービスを構築できます

HTTP/1.1でprotobufメッセージを送信するRESTfulサービスを構築できます。

RESTfulサービスはHTTP/x.xの上の「ハック」ではありません、それらはあらゆるバージョンのHTTPを成功させた基本的な建築原理(GET要求のキャッシュ可能性とPUT要求の再生可能性のような)に続くサービスです。

gRPC、SOAPなど。他のものはよりハックのようなものです - ファイヤーウォールとミドルボックスの制限を回避するために、HTTP上でRPCスタイルのサービスをトンネリングするためのHTTP上のハックです。それは必ずしも悪いことではありません。時にはあなたはRESTの代わりにRPCスタイルのサービスを望んでいるかもしれません、そして私たちはミドルボックスを置き換えるのが難しい世界に住んでいなければなりません。

RESTの実際の定義について読む時間がない場合は https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_Arch_style.htm

常にTLDRがあります。ウィキペディアのバージョン:

https://en.wikipedia.org/wiki/Representational_state_transfer

あなたがRPCスタイルのサービスを必要とするなら、確かに、gRPCは素晴らしいです。 Web上で生活したい場合、またはRESTfulスタイルのサービスに付随するすべての利点を得たい場合は、RESTfulスタイルのサービスを構築してください。あなたの安らかなサービスの中でJSONフォーマットでデータをシリアライズ/デシリアライズするのが遅すぎるなら、protobufなどを使うのは全く問題ありません。

GRPCが何かのバージョン2であれば、それはSOAPのバージョン2です。 SOAPのようにそれほどひどくはないもの。

そして、いいえ、あなたは単にあなたのGETリクエストで "任意の関数を呼び出す"こと、そしてRESTfulなサービスを持つことはできません。

最後にもう1つ:RESTfulなサービス上でprotobufsを使いたいのなら、content typeヘッダなどを使って正しく実行してください。これで、JSONとprotobufの両方を簡単にサポートできます。

私のSOAPボックスから降りる.. ..)

20
user2077221

RESTに対するgRPCの最大の利点は、おじいちゃんHTTP 1.1に比べてHTTP/2がサポートされていることです。それからHTTP 1.1上のHTTP/2の最大の利点は、「HTTP/2はサーバーがコンテンツを「プッシュ」することを可能にする」です。

6
Denis Wang