分类:grpc| 发布时间:2025-01-04 23:38:00
原文: Go Quick start
本指南通过一个简单的示例,帮助您快速上手在 Go 中使用 gRPC。
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
$ export PATH="$PATH:$(go env GOPATH)/bin"
示例代码在 grpc-go 仓库中。
$ 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 服务是使用 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;
}
记住,需要保存文件。
在你使用新的服务方法前,你需要重新编译更新后的 .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