はじめに
goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
Quick start – gRPC
goもgRPCもよくわかってない。
環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
grpc/go - Docker Hub
Docker
こんな感じで立ち上げた。Dockerよくわからん 。
docker pull grpc/go
docker run --name grpc-go -it grpc/go /bin/bash
Quick Start
Quick Startにそって順番に実行していく。
下記コマンドを実行すると、
$ go run greeter_server/main.go
こんな感じのエラーが出る。
cannot find package "golang.org/x/net/http2"
とか
undefined: "github.com/golang/protobuf/proto".ProtoPackageIsVersion4
必要そうなのを入れたり、下記コマンドで入れ直したりした。
go get golang.org/x/sys/unix
go get golang.org/x/net/http2
go get google.golang.org/genproto/googleapis/rpc/status
go get -u github.com/golang/protobuf/proto
最後のやつはコピペもとを真似して-u
をつけたけど、よくわかってない。
updateっぽいけど。
go - The Go Programming Language
The -u flag instructs get to update modules providing dependencies of packages named on the command line to use newer minor or patch releases when available. Continuing the previous example, 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, but C does not provide any packages needed to build packages in A (not including tests), then C will not be updated.
上記エラーが出た時に、下記コマンドうったりして、消して入れ直したりしてたから、バージョンとかがよくわからなくなった。
そのうち、わかるようになりたい。rm
したけど、そういえばバイナリファイルは消してない。どうなったんやろう?上書きされたんかな?
rm -rf /go/src/github.com/golang/protobuf/proto
rm -rf /go/src/google.golang.org/grpc/
git clone https://github.com/grpc/grpc-go
エラー出た時、こことかを参考にした。
Go Frequently Asked Questions | Protocol Buffers | Google Developers
上記対応で、最初の、serverとclientの方は動いた。
その後、SayHelloAgainをすると、undefinedと言われた。
$ go run greeter_client/main.go
# command-line-arguments
greeter_client/main.go:59:12: c.SayHelloAgain undefined (type helloworld.GreeterClient has no field or method SayHelloAgain)
main.go
にあるpb "google.golang.org/grpc/examples/helloworld/helloworld"
が怪しかったので、パスを辿って見てみると、/go/src/google.golang.org/grpc/examples/helloworld/helloworld
にhelloworld.proto
の古いやつがあった。
どうするのが良いのかよくわからんかったけど、修正後の~/grpc-go/examples/helloworld/helloworld
を上記パスに上書きコピーした。
再度、serverとclientを実行すると期待通り動いた。
とりあえず、よかった。hello world
できた。
環境
最終的に動いた時の環境はこんな感じ。
go get
で入れたバージョンの確認方法がよくわからん 。
GOPATH
とかはdocker pull
したイメージでデフォルトで入ってた。
.bashrc
は空っぽでも動いてる。
# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/go"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build743505095=/tmp/go-build -gno-record-gcc-switches"
# go version
go version go1.10.4 linux/amd64
# protoc --version
libprotoc 3.6.0
最後に
ハローワールド的なことできた。よくわからんことだらけなので、ちょっとずつ調べながら学んでこう。