gRPCとは?
Googleが開発したオープンソースの高性能なリモートプロシージャコールです。あるコンピュータで実行されるプログラムを別コンピュータに機能を依頼する手法のこと。
低遅延、高いスループット、多言語対応などの特徴があります。
Googleが開発しただけあって、Go言語使っている人には非常に人気の通信規格。(GoogleのAPIを利用する場合はRESTかgRPCか選べるような仕様になっていることが多い。)
昔あったRPCをHTTP/2のバイナリをベースとしたプロトコルを使用しています。
RPC(リモートプロシージャコール)
リモートにあるメソッドを呼び出せること。
Protocol Buffers
プロトコルバッファをシリアライゼーションフォーマット(データ型をどのようにバイトデータに変化関して通信するかのこと)として採用しております。
一つのTCPコネクションで並列したやりとりができます。
構造は.protoファイルに記述する。(serviceやmessageなどを定義する。)
用途
- マイクロサービス間の通信、
- API通信
効率的な通信が求められる。特に、マイクロサービス間(バックエンド間)の通信でよく使われています。
特徴
ストリーミング
リクエストやレスポンスなどの送信を効率的に行うためのものでクライアントサーバー間でバイディレクショナルな通信が可能となる。
普通の通信(Unary RPC)
1リクエスト1レスポンスの普通の通信。これも普通にできる。従来のRESTはこれ。
サーバーストリーミング
クライアントが1回通信を送ってサーバーが何度も通信を返す。push通知などで使う。
例:最初にログインして通信を繋いでおいて、サーバー側からpushで通信をもらう。
RESTだとwebsocketを導入しなきゃいけなかったが、gRPCであればgRPCだけで完結することができる。
クライアントストリーミング
ファイルアップロードなど。クライアント側から小刻みにデータを送ることができる。
双方向ストリーミング(Bidirectional streaming RPC)
クライアント側からもサーバー側からもデータを何度も送ることができる。活用例:チャットやゲームなど。
デッドライン、キャンセル
リクエストが長期間実行されないようにするためのもの。リソースの節約に役立つ。
フロー制御
通信の速度を管理するために使用される。クライアントサーバーが適切なペースでデータ送受信できるようになる。
エラーハンドリング
通信中にエラーが発生した場合に適切な対処ができるようになる。
アーキテクチャ
プラグインアーキテクチャを採用しています。
カスタム認証
ロードバランシング
リトライポリシー
開発の流れ
スキーマ駆動で開発します。
1.「.protoファイル」でスキーマ定義
REST APIで言うところのswagger的なもの。フォーマットが固定されるので、クライアントサーバー間で認識の違いがなくなる。
service
リモートから呼ばれるメソッドのリクエストとレスポンスを定義する。
message
リクエストとレスポンスのデータ型を定義する。
2.コード自動生成
.protoファイルから自動でコードを生成できます。protocコマンド。サーバークライアントともに自動生成される。
3.コードにロジック追加
生成されたコードにロジックを追加します。
実装
proxyが必要。
Envoyなどがよく使われる。DockerImageで提供されているので、Dockerで構築するのが楽。
8080で受け取ったリクエストを9090に通信をproxyしてくれる。
protoファイル
api側の実装
クライアント側の実装
npmで、「google-protobuf」や、「grpc-web」などが必要。
grpc-web
- gRPCをWebブラウザで利用するためのライブラリ。HTTP1の下位互換性もある。
- HTTP1ではテキストしか扱えないので、Protocol BuffersによってシリアライズされたデータはBase64でエンコードされる。
- 2021年時点ではUnary RPCとServer streaming RPCに対応していた。
- なお、grpc-webであればenvoy-proxyは必要なく開発ができる(BFFはコストがかかる。)
デメリットとしては、
- swagger UIのようなものがない。
- エンコードされていて中身が見えない。(シリアライズされている中身を見るChrome Extensionなどもある。gCapなど。)
- ライブラリが非常に重い。
- クライアントサイドでデシリアライズするためのstubファイルが大きい。
この記事へのコメントはありません。