【gRPC】について調べたことメモ
あとでサクッと見返せるようにgRPCについて参考元から記事切りはりしました。
RPCとは
RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。
RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。
RPC仕様では呼び出し側、手続き側の双方がRPCによる呼び出しに対応するためのAPIと、ネットワーク上で呼び出し要求メッセージや応答メッセージを送受信するための通信規約(RPCプロトコル)を定めている。
main関数の中からhello関数に引数を渡して呼び出し、そこから戻り値を受け取って標準出力にprintしているプログラムです。
これの表現を変えると「main関数の中からhelloというProcedure1をCall(呼び出し)している」というようにもいうことができます。
ここで例にあげたProcedure Callは「main関数と呼び出しProcedureであるhello関数が、同じローカル上にある」パターンです。
これに対してRemote Procedure Callは、呼び出し元(=main関数)と呼び出されるProcedure(=hello関数)が別の場所・別のサーバー上にあるパターンのことを指しています。
RPCを具現したgRPC
gRPCがRPCを実現させるために使っている技術は、大きく分けて2つ存在します。
- HTTP/2
- Protocol Buffers
gRPCでは、HTTP/2のPOSTリクエストとそのレスポンスを使ってこれを実現しています。
- 呼び出す関数の情報: リクエストのパスに含める
- 呼び出す関数に渡す引数: HTTPリクエストボディに含める
- 呼び出した関数の戻り値: HTTPレスポンスボディに含める
シリアライズ方式 - Protocol Buffers
この図わかりやすい
protoファイルでProcedureを定義する
RPCは関数の呼び出しのわけですから、その関数の定義・戻り値・引数の定義をしていく必要があります。
そのProcedureの定義を、gPRCではprotoファイルというものを使って行っています。
protoファイルの記述方式
// protoのバージョンの宣言
syntax = "proto3";
// protoファイルから自動生成させるGoのコードの置き先
// (詳細は4章にて)
option go_package = "pkg/grpc";
// packageの宣言
package myapp;
// サービスの定義
//メソッドをいくつかまとめて一括りにしたものをサービスという
service GreetingService {
// サービスが持つメソッドの定義
//gRPCで呼び出そうとするProcedure(関数)をメソッドという
rpc Hello (HelloRequest) returns (HelloResponse);
}
// 型の定義
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
googleが定義してる便利型
実際にこの通信を実現されるためには、
- HelloRequest型のリクエストを受け取り、レスポンスをHelloRespomse型にして返すサーバー
- HelloRequest型のリクエストを送信して、HelloRespomse型のレスポンスを受け取るクライアント
が必要。作ったprotoファイルから、gRPC通信を実装したGoのコードを自動生成する。
hello.pb.go
には、protoファイル内で定義したメッセージHelloRequest/HelloResponse型を、Goの構造体に定義しなおしたものが自動生成されています。
Discussion