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/binPATH协议编译器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文件包含:

  • 生成的客户端和服务器代码。
  • 用于填充,序列化和检索我们HelloRequestHelloReply消息类型的代码。

尝试运行

要编译并运行服务器和客户端代码,go run可以使用该命令。在示例目录中:

1go run greeter_server/main.go

从另一个终端:

1go run greeter_client/main.go

如果一切顺利,您将Greeting: Hello world在客户端输出中看到。

恭喜你!您刚刚使用gRPC运行了客户端服务器应用程序。

更新gRPC服务

现在让我们看一下如何使用服务器上的附加方法更新应用程序,以供客户端调用。我们的gRPC服务是使用协议缓冲区定义的;您可以.proto 在《什么是gRPC?》中找到更多有关如何在文件中定义服务的信息。gRPC基础知识:Go。现在,您只需要知道服务器和客户端“存根”都有一个SayHelloRPC方法,该方法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())

运行

  1. 运行服务器:

    1go run greeter_server/main.go
    
  2. 在另一个终端上,运行客户端:

    1go run greeter_client/main.go
    

    您将看到以下输出:

    1Greeting: Hello world
    2Greeting: Hello again world