2021/11/21

[golang][grpc]protocの準備

golang で gRPC をやりたい。

ということは、protobuf がいるので、protoc がいる。
準備しよう。


インストール手順があった。

Protocol Buffer Compiler Installation | gRPC
https://grpc.io/docs/protoc-installation/

これを書いている時点での最新版は v3.19.1。

https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.1

私が動かしている Ubuntu にも protoc はインストールされていたのだが、あんまり新しくない。

$ protoc --version
libprotoc 3.6.1

GitHub の方からコンパイル済みの zipファイルをダウンロードして、$HOME/.local に展開する。

$ protoc --version
libprotoc 3.19.1

新しくなった。


golang で使うには protobuf compiler だけでは足りない。
というか、protoc はプラグインで各言語向けのソースを吐き出してくれるので、その準備がいる。

golang の場合は楽だ。

Quick start | Go | gRPC
https://grpc.io/docs/languages/go/quickstart/

今見ると、 protoc-gen-go@v1.26protoc-gen-go-grpc@v1.1 になっているが、protoc-gen-go の latestは v1.27.1 だった(protoc-gen-go-gprc の latestはv1.1.0だった。)。
v1.27.1 にした方がよいのかな? メジャーバージョンアップでもないし新しい方がよいかもしれん。困るまで v1.27.1 にしてみよう。
GOPATH は好きに設定すれば良いが、プロジェクトごとに GOPATH を設定しているならどこかにまとめておいた方がよいだろう。

 

Quick Start の順番にやっているので、次は example だ。
今は grpc-go の v1.41.0 を clone するよう書かれているが、最新は v1.42.0 だったのでそちらにした。

まずサーバ側を起動。

$ go run greeter_server/main.go
go: downloading github.com/golang/protobuf v1.4.3
go: downloading google.golang.org/protobuf v1.25.0
go: downloading golang.org/x/net v0.0.0-20200822124328-c89045814202
go: downloading google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98
go: downloading golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd
go: downloading golang.org/x/text v0.3.0
2021/11/21 13:21:11 server listening at [::]:50051

別のターミナルからクライアントを起動すると、たぶんサーバ側と通信している。

$ go run greeter_client/main.go
2021/11/21 13:22:03 Greeting: Hello world

こちらはサーバ側の出力。

2021/11/21 13:22:03 Received: world

うん、なんというか、protoc などを自分でやっていないので、gRPC したって気分になれないね。
というわけで、その次の gRPCサービスの更新をやろう。


さて、ファイルの構成はこんな感じ。

image

サーバとクライアントにそれぞれ main.go があって、あとは protoファイルとコンパイルされた pb.go と _grpc.pb.go がある。
ただの pb.go の方は protobuf のシリアライズ/デシリアライズの処理、_grpc.pb.go の方は gRPCのサーバ/クライアントの処理になっているそうだ(basics tutorial)。

あまり深く考えず、proto ファイルに SayHelloAgain()を追加しよう。
そして protoc でコンパイル。
--go_ が pb.go で --go-grpc_ が _grpc.pb.go になる。paths=source_relative は相対パスの場所にファイル生成する。

protoc でコンパイルできたら、それぞれの main.go を変更して同じように実行させると SayHelloAgain が動いていることが確認できるだろう。


ツールとしてはこのくらいあれば golang で gRPC できることがわかった。
あとは・・・知識がいるだけである。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。