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