【gRPC】.protoファイルを作成し、コンパイルしてGo言語で使用するまで
gRPCとは?
gRPCでは、RPC(Remote Procedure Call)メソッドを定義することで、ネットワークを介して別のサーバー上の関数やメソッドを呼び出すことができる。
Protocol Buffers(protobuf)は、gRPCで使用されるインターフェース定義言語(IDL)。これを使って、サービスとそのRPCメソッド、それらのメソッドが受け取り・返すメッセージの形式を定義する。
JSONやXMLなどの伝統的なフォーマットに比べて、より小さいサイズで、より速い速度でデータを伝送できる。
.protoファイル内でのRPCメソッドの定義方法
サービス定義:
まず、serviceキーワードを使ってサービスを定義する。サービスは一連のRPCメソッドのコレクション。
Go
// test.proto
service MyService {
// RPCメソッドはここに定義される。
}
RPCメソッド定義:
サービス内に、rpcキーワードを使用してメソッドを定義する。メソッドは入力メッセージタイプと出力メッセージタイプを指定する必要がある。
関数名はリクエスト(リクエストを送るメソッド)にのみ付けられ、レスポンスの型には関数名を付けない。レスポンスはメソッドの戻り値の型として定義されるため。
Go
// test.proto
service MyService {
// 単一のリクエストとレスポンスを持つRPCメソッド
rpc MyMethod(MyRequest) returns (MyResponse);
}
メッセージ定義:
RPCメソッドの入力と出力で使用されるメッセージタイプを定義する。
Go
// test.proto
message MyRequest {
// リクエストパラメータを定義
}
message MyResponse {
// レスポンスパラメータを定義
}
ストリーミング
https://grpc.io/docs/languages/go/basics/
ストリーミングと単一のリクエスト/レスポンスモデルの違い
gRPCはストリーミングRPCもサポートしている。
従来のRPC通信では、クライアントがサーバーにリクエストを送り、サーバーがそれに対して一つのレスポンスを返す。しかし、ストリーミングを使用すると、一度の接続で複数のインスタンス(同じメッセージ型のデータが複数回、連続してやり取りされること)を送受信できるようになる。
例えば、サーバーストリーミングRPCでは、クライアントは一回のリクエストを送り、サーバーから複数のレスポンスが時系列に沿って順番に送られてくる。
例: サーバーがストック価格のリアルタイム情報をクライアントに送信するケース。
Go
message StockRequest {
string stock_symbol = 1;
}
message StockResponse {
string stock_symbol = 1;
float price = 2;
string timestamp = 3;
}
service StockService {
rpc GetStockUpdates(StockRequest) returns (stream StockResponse);
}
クライアントがStockRequestを送信し、"AAPL"(Apple Inc.の株式シンボル)に関する更新をリクエストする。サーバーはこれを受け取り、Appleの株価に関するStockResponseメッセージをストリームとして送る。
サーバーからのレスポンスは以下のように
続きは、下記で記載しています。