📺

gRPCとProtocol Buffers(protobuf)を完全に理解した✨

2024/03/17に公開

gRPC通信について調べたからまとめるね

RPC通信って?👀

RPC「リモートプロシージャーコール(Remote Procedure Call)」 のこと!

んで、プロシージャーはプログラムの関数(とか処理、メソッド) のこと!

だから、プロシージャーコールは「関数(処理)を呼びだす」 っていう意味になるね!

「RPC(リモートプロシージャーコール)通信」は、要は「外から通信して(リモートで)サーバー上にある関数を呼びだす」通信ってことだね!

例えば、クライアント(リモート)からサーバーにあるSayHelloっていう関数(プロシージャー)を呼んだら(Call)、"Hello, John"ってレスポンスが返ってくるみたいな感じ✨

[クライアント] --- SayHello("John") ---> [サーバー]
       |                                  |
       | <------- "Hello, John" --------- |

gRPCの「g」は「google」のこと??

んで、gRPCの頭の「g」は googleの「g」!!

GitHub上では、gについてはリリース毎に意味合いが異なると説明がされてるよ✨↓

g_stands_for.md

'g' stands for something different every gRPC release:

1.0 'g' stands for 'gRPC'
1.1 'g' stands for 'good'
1.2 'g' stands for 'green'
1.3 'g' stands for 'gentle'
1.4 'g' stands for 'gregarious'
1.6 'g' stands for 'garcia'
1.7 'g' stands for 'gambit'
1.8 'g' stands for 'generous'
1.9 'g' stands for 'glossy'
1.10 'g' stands for 'glamorous'
1.11 'g' stands for 'gorgeous'
1.12 'g' stands for 'glorious'
1.13 'g' stands for 'gloriosa'
1.14 'g' stands for 'gladiolus'
1.15 'g' stands for 'glider'
1.16 'g' stands for 'gao'
1.17 'g' stands for 'gizmo'
1.18 'g' stands for 'goose'
1.19 'g' stands for 'gold'
1.20 'g' stands for 'godric'
1.21 'g' stands for 'gandalf'
1.22 'g' stands for 'gale'
1.23 'g' stands for 'gangnam'
1.24 'g' stands for 'ganges'
1.25 'g' stands for 'game'
1.26 'g' stands for 'gon'
1.27 'g' stands for 'guantao'
1.28 'g' stands for 'galactic'
1.29 'g' stands for 'gringotts'
1.30 'g' stands for 'gradius'
1.31 'g' stands for 'galore'
1.32 'g' stands for 'giggle'
1.33 'g' stands for 'geeky'
1.34 'g' stands for 'gauntlet'
1.35 'g' stands for 'gecko'
1.36 'g' stands for 'gummybear'
1.37 'g' stands for 'gilded'
1.38 'g' stands for 'guadalupe_river_park_conservancy'
1.39 'g' stands for 'goofy'
1.40 'g' stands for 'guileless'
1.41 'g' stands for 'goat'
1.42 'g' stands for 'granola'
1.43 'g' stands for 'green'
1.44 'g' stands for 'great'
1.45 'g' stands for 'gravity'
1.46 'g' stands for 'golazo'
1.47 'g' stands for 'gridman'
1.48 'g' stands for 'garum'
1.49 'g' stands for 'gamma'
1.50 'g' stands for 'galley'
1.51 'g' stands for 'galaxy'
1.52 'g' stands for 'gribkoff'
1.53 'g' stands for 'glockenspiel'
1.54 'g' stands for 'gracious'
1.55 'g' stands for 'grandslam'
1.56 'g' stands for 'galvanized'
1.57 'g' stands for 'grounded'
1.58 'g' stands for 'goku'
1.59 'g' stands for 'generative'
1.60 'g' stands for 'gjallarhorn'
1.61 'g' stands for 'grand'
1.62 'g' stands for 'guardian'
1.63 'g' stands for 'giggle'
(引用:https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md

それからgRPCでは、googleが開発した 「Protocol Buffers(protobuf)」 っていう言語みたいなものを使用するよ!

元々googleが開発してたけど、今ではオープンソース化しているんだ〜✨

じゃあ、Protocol Buffers(protobuf)って?

RPC通信はリクエストを送ったらレスポンスが返ってくるって仕組みなんだけど、 リクエスト(関数名と引数の型)とレスポンス(値の型)のセット を決めておくんだ(=定義)!

  • リクエスト:
    • 関数(メソッド)名と引数の型
    • 例)SayHello(String) ← 引数の中には例えば "John" とか!
  • レスポンス:
    • 値の型
    • 例)String ← 具体的には "Hello, John" とか!

その定義を書くときに、googleが作った便利な「protobuf(プロトバフ)」っていう言語(みたいなやつ)を使うの。

TypeScriptなら型定義みたいなものだし、Golangならインターフェース、RustならTraitみたいなやつなんだ!

じゃあ、この図↓をprotobufで書いてみるね

[クライアント] --- SayHello("John") ---> [サーバー]
       |                                  |
       | <------- "Hello, John" --------- |

「greeter.proto」ファイル(※ protobufの拡張子は「.proto」

syntax = "proto3"; // 使用するプロトコルバッファのバージョンを指定

package example; // パッケージ名を指定

// HelloRequestメッセージ定義
message HelloRequest {
  // nameフィールド(String型)※「name」とかは自由に決めていいよ
  string name = 1;
}

// HelloReplyメッセージ定義
message HelloReply {
  // messageフィールド(string型)※「message」とかは自由に決めていいよ
  string message = 1;
}

// Greeterサービス定義
service Greeter {
  // SayHelloメソッド定義 ※メソッドは複数書いてもいいんだよ
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

「SayHello (HelloRequest) returns (HelloReply) {}」の意味

SayHelloメソッドは、引数にHelloRequest(String型)が入って、返り値はHelloReply(String型)ってこと!

protobufのすごいところ!

protobufは関数の引数と返り値の型を定義できたよね。

この定義ファイルを使って、TypeScript, Golang, Rustとか色んな言語用の型定義コードを生成できるんだ!

  .protoファイル
        |
        | 1. プロトコルバッファの定義
        |
        v
  protocコンパイラ
        |
        | 2. GolangとTypeScriptのコード生成
        |
  ------+-------
  |            |
  v            v
Golang     TypeScript
(サーバー)  (クライアント)
  |            |
  | 3. コード   | 3. コード
  |(型定義を含む)|   (型定義を含む)
  |            |
  v            v
サーバーアプリ  クライアントアプリ

protobufがあれば色んな言語に対応してコードを出力できるから、言語の垣根なく型(関数の引数と返り値の型)を統一的に扱えるんだ

すごいよね!

終わりに

もし、間違いやご不明点があればコメントいただければ幸いです😊

ヌギーのSNS(連絡先)

Discussion