Go语言gRPC快速入门
go语言gRPC快速入门
先决条件
需要golang1.6+版本
gRPC安装
使用以下命令安装gRPC。
1go get -u google.golang.org/grpc
Protocol Buffers v3
安装用于生成gRPC服务代码的协议编译器。最简单的方法是protoc-<version>-<platform>.zip
从此处下载适用于您的平台的预编译二进制文件:https : //github.com/google/protobuf/releases
- 解压缩该文件。
- 更新环境变量
PATH
以包括协议二进制文件的路径。
接下来,为Go安装protoc插件
1go get -u github.com/golang/protobuf/protoc-gen-go
编译器插件protoc-gen-go
将会安装在中$GOBIN
,默认为$GOPATH/bin
。PATH
协议编译器protoc 必须在您的目录中才能找到它。
1export PATH=$PATH:$GOPATH/bin
下载示例
随同获取的grpc代码go get google.golang.org/grpc
也包含示例。它们可以在dir目录下找到$GOPATH/src/google.golang.org/grpc/examples
。
建立例子
转到示例目录
1cd $GOPATH/src/google.golang.org/grpc/examples/helloworld
gRPC服务在.proto
文件中定义,该文件用于生成相应的.pb.go
文件。该.pb.go
文件是由编译生成的 .proto
用协议的编译器文件:protoc
。
就本示例而言,该helloworld.pb.go
文件已经生成(通过编译helloworld.proto
),可以在以下目录中找到: $GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworld
该helloworld.pb.go
文件包含:
- 生成的客户端和服务器代码。
- 用于填充,序列化和检索我们
HelloRequest
和HelloReply
消息类型的代码。
尝试运行
要编译并运行服务器和客户端代码,go run
可以使用该命令。在示例目录中:
1go run greeter_server/main.go
从另一个终端:
1go run greeter_client/main.go
如果一切顺利,您将Greeting: Hello world
在客户端输出中看到。
恭喜你!您刚刚使用gRPC运行了客户端服务器应用程序。
更新gRPC服务
现在让我们看一下如何使用服务器上的附加方法更新应用程序,以供客户端调用。我们的gRPC服务是使用协议缓冲区定义的;您可以.proto
在《什么是gRPC?》中找到更多有关如何在文件中定义服务的信息。和gRPC基础知识:Go。现在,您只需要知道服务器和客户端“存根”都有一个SayHello
RPC方法,该方法HelloRequest
从客户端获取参数并HelloReply
从服务器返回a ,并且该方法的定义如下:
1// The greeting service definition.
2service Greeter {
3 // Sends a greeting
4 rpc SayHello (HelloRequest) returns (HelloReply) {}
5}
6
7// The request message containing the user's name.
8message HelloRequest {
9 string name = 1;
10}
11
12// The response message containing the greetings
13message HelloReply {
14 string message = 1;
15}
让我们对其进行更新,以便该Greeter
服务具有两种方法。确保您位于与上述($GOPATH/src/google.golang.org/grpc/examples/helloworld
)相同的示例目录中。
helloworld/helloworld.proto
使用SayHelloAgain
具有相同请求和响应类型的新方法来编辑和更新它:
1// The greeting service definition.
2service Greeter {
3 // Sends a greeting
4 rpc SayHello (HelloRequest) returns (HelloReply) {}
5 // Sends another greeting
6 rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
7}
8
9// The request message containing the user's name.
10message HelloRequest {
11 string name = 1;
12}
13
14// The response message containing the greetings
15message HelloReply {
16 string message = 1;
17}
生成gRPC代码
接下来,我们需要更新应用程序使用的gRPC代码以使用新的服务定义。从与上述($GOPATH/src/google.golang.org/grpc/examples/helloworld
)相同的示例目录中:
1$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
这将通过我们的新更改重新生成helloworld.pb.go。
更新并运行应用程序
现在,我们有了新生成的服务器和客户端代码,但是仍然需要在示例应用程序的人工编写部分中实现并调用新方法。
更新服务器
编辑greeter_server/main.go
并添加以下功能:
1func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
2 return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
3}
更新客户端
编辑greeter_client/main.go
以将以下代码添加到主要功能。
1r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: name})
2if err != nil {
3 log.Fatalf("could not greet: %v", err)
4}
5log.Printf("Greeting: %s", r.GetMessage())
运行
-
运行服务器:
1go run greeter_server/main.go
-
在另一个终端上,运行客户端:
1go run greeter_client/main.go
您将看到以下输出:
1Greeting: Hello world 2Greeting: Hello again world
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/Golang/2020-03-10_gRPC_go/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。