快速入门
本指南通过一个简单的示例帮助您开始使用 Go 中的 gRPC。
快速入门
先决条件
有关安装说明,请参阅 Go 的 入门 指南。
Protocol buffer 编译器,
protoc
,版本 3。有关安装说明,请参阅 Protocol Buffer 编译器安装。
用于协议编译器的 Go 插件
使用以下命令安装 Go 的协议编译器插件
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.69.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 服务使用 协议缓冲区 定义。要了解有关如何在 .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