gRPC-Go
Github
gRPC的Go实现:一个高性能、开源、通用的RPC框架,将移动和HTTP/2放在首位。有关更多信息,请参阅Go gRPC文档,或直接进入快速入门。
一、快速入门
本指南通过一个简单的工作示例让您开始在Go中使用gRPC。
1.1 先决条件
- Go:三个最新主要版本中的任意一个。
- Protocol buffer:compiler, protoc, version 3.
- 有关安装说明,请参阅协议缓冲区编译器安装。
- 协议缓冲区编译器的Go插件:
1、使用以下命令安装Go的协议编译器插件:
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
2、更新您的PATH,以便协议编译器可以找到插件:
$ export PATH="$PATH:$(go env GOPATH)/bin"
1.1.1 Get the example code
示例代码是grpc-go repo的一部分。
1、 将repo下载为zip文件并解压缩,或克隆repo:
$ git clone -b v1.52.0 --depth 1 https://github.com/grpc/grpc-go.git
2、 Change to the quick start example directory:
$ cd grpc-go/examples/helloworld
1.1.2 Run the example
在examples/helloworld
目录中:
1、编译并执行服务器代码:
$ go run greeter_server/main.go
2、从不同的终端,编译并执行客户端代码,以查看客户端输出:
$ go run greeter_client/main.go
Greeting: Hello world
恭喜你!您刚刚使用gRPC运行了一个客户机-服务器应用程序。
1.2 更新gRPC服务
在本节中,您将使用一个额外的服务器方法更新应用程序。gRPC服务是使用协议缓冲区(protocol buffers
)定义的。要了解如何在.proto
文件中定义服务的更多信息,请参阅基础教程。现在,所有你需要知道的是,服务器和客户端存根都有一个SayHello()
RPC方法,它从客户端接受一个HelloRequest参数,并从服务器返回一个HelloReply,该方法是这样定义的:
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
打开helloworld/helloworld.proto
。并添加一个新的SayHelloAgain()
方法,具有相同的请求和响应类型:
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
记得保存文件!
1.3 重新生成gRPC代码
在使用新的服务方法之前,需要重新编译更新后的.proto
文件。
仍然在examples/helloworld
目录下时,运行以下命令:
$ protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto
错误提示:protoc-gen-go-grpc: program not found or is not executable
需要安装以下gRPC gen插件:
go get -u google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go
go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
他将重新生成helloworld/helloworld.pb.go
和helloworld/helloworld_grpc.pb.go
文件,包含:
- 用于填充、序列化和检索
HelloRequest
和HelloReply
消息类型的代码。 - 生成客户端和服务器代码。
1.4 更新并运行应用程序
您已经重新生成了服务器和客户机代码,但是仍然需要在示例应用程序的人工编写部分实现和调用新方法。
更新服务器
打开 greeter_server/main.go
并添加以下函数:
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
}
更新客户端
打开 greeter_client/main.go
,将以下代码添加到main()
函数体的末尾:
r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
运行
像以前那样运行客户机和服务器。在examples/helloworld
目录中执行以下命令:
- Run the server:
$ go run greeter_server/main.go
- 从另一个终端运行客户端。这一次,添加一个名称作为命令行参数:
$ go run greeter_client/main.go --name=Alice
您将看到以下输出:
Greeting: Hello Alice
Greeting: Hello again Alice