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.26 と protoc-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サービスの更新をやろう。
さて、ファイルの構成はこんな感じ。
サーバとクライアントにそれぞれ 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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。