見出し画像

【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メッセージをストリームとして送る。
サーバーからのレスポンスは以下のように

続きは、下記で記載しています。


この記事が参加している募集

仕事について話そう

よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費に使わせていただきます!