hello, grpc
envoy の流れで go-control-plane を小一時間眺めたがよくわからなかった。grpcサンプルを実行したものの書いてないから?ここをアレンジしつつ写経し、ここにおいた。
protoc 導入
windows なので、ここ から protoc-3.8.0-win64.zip ダウンロード -> 展開 -> protoc.exe を path が通ってるところに配置。
proto ファイルを書く
syntax = "proto3"; package ping; service Ping { rpc Hello (HelloRequest) returns (HelloResponse) { } } message HelloRequest { string toMessage = 1; } message HelloResponse { string resMessage = 1; }
proto ファイルからgoのファイルを生成
protoc すると ping.proto の階層に ping.pb.go が生成される。
protoc --go_out=plugins=grpc:./ proto/ping/ping.proto
grpc サーバを作る
service.go
package main import ( "log" "net" "google.golang.org/grpc" "golang.org/x/net/context" "grpcprac/prac1/proto/ping" ) type PingService struct { } func (s *PingService) Hello(ctx context.Context, req *ping.HelloRequest) (*ping.HelloResponse, error) { toMessage := req.GetToMessage() log.Println(toMessage) response := ping.HelloResponse{ ResMessage: "I hear " + toMessage, } return &response, nil } var port = ":19003" func main() { listenPort, err := net.Listen("tcp", port) if err != nil { log.Fatalln(err) } server := grpc.NewServer() pingService := PingService{} ping.RegisterPingServer(server, &pingService) log.Printf("[server started] localhost%s", port) err = server.Serve(listenPort) if err != nil { log.Fatalln(err) } }
grpc クライアントを作る
package main import ( "context" "log" "time" "google.golang.org/grpc" "grpcprac/prac1/proto/ping" ) const ( address = "localhost:19003" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := ping.NewPingClient(conn) message := "qwer" ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.Hello(ctx, &ping.HelloRequest{ToMessage: message}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Ping: %s", r.ResMessage) }
実行
サーバ
>go run service.go go: finding github.com/golang/protobuf/proto latest go: finding golang.org/x/net/context latest go: finding google.golang.org/grpc/codes latest go: finding google.golang.org/grpc/status latest go: finding golang.org/x/net latest 2019/06/25 20:24:03 [server started] localhost:19003 2019/06/25 20:24:13 qwer 2019/06/25 20:24:18 qwer 2019/06/25 20:24:24 qwer 2019/06/25 20:24:29 qwer
クライアント
>go run client.go 2019/06/25 20:24:13 Ping: I hear qwer >go run client.go 2019/06/25 20:24:18 Ping: I hear qwer >go run client.go 2019/06/25 20:24:24 Ping: I hear qwer >go run client.go 2019/06/25 20:24:29 Ping: I hear qwer