gRPCとは
- サービス間でHTTP/2を利用してやり取りするための技術
- gRPCとはRPCを実現するためのGoogleが開発したプロトコルの1つ。オープンソースのRPCのフレームワーク
- サーバ上に登録されている関数を、クライアントに応じて呼び出す
→RPC(Remote Procedure Call)
gRPCの特徴
-
特定の言語やプラットフォームに依存しない
-
クライアント-サーバ間の通信にはデフォルトではHTTP/2を使用、データシリアライズにはProtocol Buffersを使用して、高速通信を実現している
→Protocol Buffersはやり取りするデータの型や構造を事前に定義する仕組みが用意されている(protoファイル)
これを利用して各言語に対応する、サーバ/クライアント用ソースコードのコード自動生成が可能に -
通信規格がHTTP/2ということは、対応していないブラウザやロードバランサはリクエストを受けることが出来ない
メリット
・Request/Response はバイナリデータの形で、送信データサイズは普段利用しているHTTP/1.x JSON/XMLより小さい
・HTTP/2の双方向通信活用して、4パターンの通信方法ある
・Restfulのようなパスを定義することが必要ない、ローカルメソッドとほぼ同じの方法で使う
・開発言語の制限なし(GoogleからgRPC自動作成ツールを提供する、いくつの言語をサポートしている)
デメリット
- Restfulのような明確に定義したリクエストメソッドがない(CRUD)
- HTTP/1.Xのサポートしていない
- 事前にメソッドの名前、Request/Response内容を定義するが必要
- Request/Responseの定義を変更する場合、もう一度compileが必要
protocol buffersとは?
- 言語やプラットフォームに依存しない、構造化されたデータをシリアライズする拡張可能なインターフェース記述言語(IDL)
- protoという拡張子のファイルで定義して、それをもとにgRPCと通信するclientを作成する。主流はversion3
- Request/Responseのフォーマットを指定できる
protoファイルのサンプル
syntax = "proto3";
option go_package = "./hello";
package hello;
service Hello {
rpc GetHelloWorld (StringRequest) returns (StringResponse) {}
}
message StringRequest {
string RequestMassage = 1;
}
message StringResponse {
string ResponseMassage = 1;
}
protoファイルの説明
Ta | Description | Remarks |
---|---|---|
syntax | バージョン定義 | 執筆時点ではproto3 が最新? |
package | パッケージの定義 | 複数の.protoファイルを利用するケースなどで、名前の衝突を避けるためにパッケージ名を設定できます |
service | gRPCに登録するサービス名を指定 | class みたいなもの? |
rpc | 関数の定義 | 今回の例では、GetHelloWorldという関数を作成し、StringRequest という引数を受け取り、StringResponse という返り値を定義しています。 |
message | 型の定義左から順に型 型の名前 = タグナンバー | 1つのmessageに複数定義する事もできます |
import | 他の.protoファイルで定義したメッセージ型を使いたい場合にインポートして利用することができます | 今回は使用していません |