快速入门
本指南将通过一个简单的示例帮助您开始使用 Go 语言中的 gRPC。
快速入门
先决条件
Go,任一两个最新主要 Go 版本。
有关安装说明,请参阅 Go 的《入门指南》。
Protocol Buffer 编译器,
protoc
,版本 3。有关安装说明,请参阅《Protocol Buffer 编译器安装》。
用于 Protocol Buffer 编译器的 Go 插件
使用以下命令安装 Go 语言的 Protocol Buffer 编译器插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
更新您的
PATH
,以便protoc
编译器能找到插件export PATH="$PATH:$(go env GOPATH)/bin"
获取示例代码
示例代码是 grpc-go 仓库的一部分。
将仓库下载为 zip 文件并解压缩,或克隆该仓库
git clone -b v1.74.2 --depth 1 https://github.com/grpc/grpc-go
切换到快速入门示例目录
cd grpc-go/examples/helloworld
运行示例
从 examples/helloworld
目录
编译并执行服务器代码
go run greeter_server/main.go
从另一个终端编译并执行客户端代码,查看客户端输出
go run greeter_client/main.go Greeting: Hello world
恭喜!您刚刚运行了一个使用 gRPC 的客户端-服务器应用程序。
更新 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;
}
记得保存文件!
重新生成 gRPC 代码
在使用新的服务方法之前,您需要重新编译更新后的 .proto
文件。
仍在 examples/helloworld
目录中时,运行以下命令
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto
这将重新生成 helloworld/helloworld.pb.go
和 helloworld/helloworld_grpc.pb.go
文件,这些文件包含:
- 用于填充、序列化和检索
HelloRequest
和HelloReply
消息类型的代码。 - 生成的客户端和服务器代码。
更新并运行应用程序
您已经重新生成了服务器和客户端代码,但仍需要在示例应用程序的人工编写部分实现并调用新方法。
更新服务器
打开 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
目录执行以下命令
运行服务器
go run greeter_server/main.go
从另一个终端运行客户端。这次,添加一个名称作为命令行参数
go run greeter_client/main.go --name=Alice
您将看到以下输出
Greeting: Hello Alice Greeting: Hello again Alice