🪐

【gRPC】について調べたことメモ

2022/10/10に公開

あとでサクッと見返せるようにgRPCについて参考元から記事切りはりしました。

RPCとは

https://e-words.jp/w/RPC.html

RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。
RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。
RPC仕様では呼び出し側、手続き側の双方がRPCによる呼び出しに対応するためのAPIと、ネットワーク上で呼び出し要求メッセージや応答メッセージを送受信するための通信規約(RPCプロトコル)を定めている。

https://zenn.dev/hsaki/books/golang-grpc-starting/viewer/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が定義してる便利型
https://developers.google.com/protocol-buffers/docs/reference/google.protobuf

実際にこの通信を実現されるためには、

  • HelloRequest型のリクエストを受け取り、レスポンスをHelloRespomse型にして返すサーバー
  • HelloRequest型のリクエストを送信して、HelloRespomse型のレスポンスを受け取るクライアント

が必要。作ったprotoファイルから、gRPC通信を実装したGoのコードを自動生成する。

hello.pb.goには、protoファイル内で定義したメッセージHelloRequest/HelloResponse型を、Goの構造体に定義しなおしたものが自動生成されています。

Discussion