将proto文件编译成go代码时,需要protoc-gen-go插件 go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装.
1 2 3 4
// gRPC运行时接口编解码支持库 go get -u github.com/golang/protobuf/proto // 从 Proto文件(gRPC接口描述文件) 生成 go文件 的编译器插件 go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go go install copy protoc-gen-go $GOBIN/ # 或者放在 /usr/local/bin/下。在$GOBIN下,始终无法生效
func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn)
// Contact the server and print out its response. name := defaultName if len(os.Args) > 1 { name = os.Args[1] } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.Message) }
服务测试
启动服务端
1
go run server.go
在另一个终端启动客户端
1 2
go run client.go // 2019/07/30 10:54:28 Greeting: Hello pangxieke
可能出现问题
implement错误
1 2 3 4
cannot use &server literal (type *server) as type test.GreeterServer in argument to test.RegisterGreeterServer: *server does not implement test.GreeterServer (wrong type for SayHello method) have SayHello("golang.org/x/net/context".Context, *test.HelloRequest) (*test.HelloReply, error) want SayHello("context".Context, *test.HelloRequest) (*test.HelloReply, error)