gRPC入門
KenjiroKubota #社内勉強会
あじぇんだ
1. gRPCとは
2. Protocol Buffersとは
3. protocを利用してコード生成
4. Goで使ってみよう
5. PHPで使ってみよう
gRPCとは
gRPC
● RPC(Remote Procedure Call)を実現するためのプロトコルの一つ
● Googleが開発
● ProtocolBuffersを利用して高速かつ低容量での通信を実現
● C++, Java, Python, Go, Ruby, C#, Node.js, PHP… さまざな言語に
対応
● gRPCの「g」はバージョン毎に意味が異なる
https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md
https://grpc.io/docs/guides/
gRPCの通信方式
UnaryRPC(SimpleRPC)
https://qiita.com/yuzo777/items/046910c95559cf0fff68
シンプルな1リクエスト1レスポンス
ServerStreamingRPC
https://qiita.com/yuzo777/items/046910c95559cf0fff68
1リクエストNレスポンス
サーバープッシュなど
ClientStreamingRPC
https://qiita.com/yuzo777/items/046910c95559cf0fff68
Nリクエスト1レスポンス
データアップロードなど
BidirectionalStreamingRPC
https://qiita.com/yuzo777/items/046910c95559cf0fff68
NリクエストNレスポンス
チャットなど
Protocol Buffersとは
Protocol Buffers
● 言語やプラットフォームに依存しない、構造化されたデータをシリア
ライズする拡張可能なメカニズム。XMLやJSONのようなインター
フェイス記述言語(IDL)。似たようなものにAvroやThriftがある。
● .protoという拡張子のファイルで定義
● 現在の主流はバージョン3
● protobufと略されることが多い
● protocというツールを利用して各言語のコードを生成する
https://dejanstojanovic.net/aspnet/2018/june/how-to-boost-application-performance-by-choosing-the-right-serialization/
https://dejanstojanovic.net/aspnet/2018/june/how-to-boost-application-performance-by-choosing-the-right-serialization/
protoファイルの書き方
宣言しないとproto2と解釈される
メッセージ型
フィールド・型指定が可能
タグナンバー
バイナリ変換時にフィールドを区別する際に利用される。
これは一度採番したら変えるべきではない。変更がある場合は新たに採番する必要がある
コメントもかけるよ
予約タグナンバーやフィールドを指定できる。
過去に使っていたタグナンバーやフィールドを指定しておくと事故らない
reservedフィールドにタグナンバーとフィールド名を混合して記述することはできない
スカラ型対応リスト
https://developers.google.com/protocol-buffers/docs/proto3
ネット見ろ
デフォルト値
string 空文字列
bytes 空バイト列
bool false
数値型 ゼロ
enum 最初に列挙されたもの(必ず0指定である必要がある)
enum型例
enum型例
proto2との互換性のため、
ゼロスタート
enum型例
他のメッセージを含める
他のメッセージを含める
oneof
どちらかの値のみを使うことでメモリを節約する仕組み。
プログラム上は最後にセットした方が有効になる。
map
配列の定義もちゃんとあります
パッケージ
メッセージの名前衝突を避けるためにパッケージで名前空間を分けることができる
サービス定義
メッセージ型をRPCでやり取りする際の定義を行うことができる。
先にあげたUnaryRPCやその他の指定はここで行う。
protocを利用してコード生成
protoファイルはそのままでは使えません
定義ファイルから対象のプログラミング言語に対応したコードを生成させ
る必要があります。
そこで、protocというコード生成ツールを利用します。
protoc
plugin
導入
● Mac
brew install protobuf
● Windows
DLしてPATH通せばよいっぽい
https://github.com/protocolbuffers/protobuf/releases
用意するprotoファイル
Goのコードを書き出す
protoファイルからGoのファイルを生成
protoファイルからGoのファイルを生成
protoファイルと同じ階層にgrpcプラグインを利用して書き出し
before after
生成されたファイル・・・!
PHPコードを書き出す
protoファイルは同じものを利用
PHPのコード生成にはプラグインが必要
protoファイルからPHPのファイルを生成
protoファイルからPHPのファイルを生成
先ほどmakeしたプラグインファイルを指定
GoでgRPCサーバーを作る
再掲) protoファイル
リクエストを受け付ける
メッセージを取得する
レスポンスを返却する
さっき作った
サービスを登録
する。
PHPでgRPCクライアントを作る
PHPでは拡張モジュールが必要
https://cloud.google.com/php/grpc
ネット見ろ
Demo
まとめ
● 思ったよりgRPCは手軽に使える
● 本番投入したことないのでツラミはわからない
● スキーマ変更が大変そう
(新しいメッセージ型にかえてしまえばよいのかな?)
● API定義書が不要
● REST APIのクライアント周り作るより楽、圧倒的に楽
● 認証周りもできるらしい
● だれかサービス担当・権限ある人導入してみて!!!www
thanks;)

gRPC入門