原文地址:https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code
本文将带你使用 go 语言实现一个 gRPC 的小小示例。
Go, 推荐安装最新的 go 版本。
具体安装方法,可以参考go 语言官方文档的 快速开始
Protocol buffer 的编译器版本 3.
具体安装方法,可以参考文章: Protocol Buffer 编译器安装
protocol 编译器的 go 语言插件:
使用下面的命令安装:
// 当前日期为20211216 最新版本为: 1.27.1
$ go install google.golang.org/protobuf/cmd/[email protected]
// 当前日期为20211216 最新版本为: 1.1.0
$ go install google.golang.org/grpc/cmd/[email protected]
将 protoc
编译器的执行文件路径添加到PATH
:
$ export PATH="$PATH:$(go env GOPATH)/bin"
示例代码仓库的位置:grpc-go .
克隆仓库,当然,您也可以下载 zip 压缩文件,下载地址: zip :
// 当前日期为20211216 最新版本为: 1.43.0
$ git clone -b v1.43.0 https://github.com/grpc/grpc-go
切换到示例文件夹:
$ cd grpc-go/examples/helloworld
假设您已经切换至目录:examples/helloworld
编译并运行服务端文件:
$ go run greeter_server/main.go
打开一个新的命令行,也要进入grpc-go/examples/helloworld
目录,运行客户端文件,观察客户端输出:
$ go run greeter_client/main.go
Greeting: Hello world
ヾ (◍°∇°◍) ノ゙, 至此,恭喜,您已经成功运行了一个包含完整客户端和服务端的 gRPC
项目。
本小节中咱们将通过扩展服务端方法来升级一下我们的示例项目。
gRPC 服务是通过 protocol buffers 来定义的,如果您想学习更多通过编写 .proto
文件来定义服务的知识,可以参考文章: 基础指引.
但现在,咱们只要知道 在示例项目中,服务端和客户端都包含一个 RPC 调用的 SayHello()
方法,并且需要从客户端传入参数 HelloRequest
, 服务端会返回 HelloReply
, 能明白到这儿,就足够了!
方法定义如下:
// 定义 greeting 服务.
service Greeter {
// 发送 greeting 信息
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 请求 message 包含用户的 name.
message HelloRequest {
string name = 1;
}
// 响应 message 包含 greetings 信息
message HelloReply {
string message = 1;
}
打开 helloworld/helloworld.proto
文件,新建 SayHelloAgain()
方法,参数和返回值和 SayHello
保持一致:
// 定义 greeting 服务.
service Greeter {
// 发送 greeting 信息
rpc SayHello (HelloRequest) returns (HelloReply) {}
// 新增方法
// 发送 另一 greeting 信息
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// 请求 message 包含用户的 name.
message HelloRequest {
string name = 1;
}
// 响应 message 包含 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
打开另一命令行窗口,运行客户端。这一次,要在命令行上添加一个名字 Alice
作为参数:
$ go run greeter_client/main.go -name=Alice
您应该看到如下输出:
Greeting: Hello Alice
Greeting: Hello again Alice