快速入门

本指南通过一个简单可行的示例,帮助您开始使用 Go 语言进行 gRPC 开发。

快速入门

本指南通过一个简单可行的示例,帮助您开始使用 Go 语言进行 gRPC 开发。

先决条件

  • Go,任意 两个最新主要 Go 版本之一。

    有关安装说明,请参阅 Go 的入门指南。

  • Protocol buffer 编译器 protoc版本 3

    有关安装说明,请参阅 Protocol Buffer 编译器安装

  • 协议编译器的 Go 插件

    1. 使用以下命令安装 Go 的协议编译器插件

      go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
      go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
      
    2. 更新您的 PATH,以便 protoc 编译器可以找到插件

      export PATH="$PATH:$(go env GOPATH)/bin"
      

获取示例代码

示例代码是 grpc-go 仓库的一部分。

  1. 将仓库下载为 zip 文件 并解压,或克隆仓库

    git clone -b v1.72.0 --depth 1 https://github.com/grpc/grpc-go
    
  2. 切换到快速入门示例目录

    cd grpc-go/examples/helloworld
    

运行示例

examples/helloworld 目录下

  1. 编译并执行服务器代码

    go run greeter_server/main.go
    
  2. 在另一个终端中,编译并执行客户端代码以查看客户端输出

    go run greeter_client/main.go
    Greeting: Hello world
    

恭喜!您刚刚成功运行了一个 gRPC 客户端-服务器应用程序。

更新 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;
}

记得保存文件!

重新生成 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.gohelloworld/helloworld_grpc.pb.go 文件,其中包含

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

更新并运行应用程序

您已经重新生成了服务器和客户端代码,但仍需要在示例应用程序中人工编写的部分实现并调用新方法。

更新服务器

打开 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 目录下执行以下命令

  1. 运行服务器

    go run greeter_server/main.go
    
  2. 在另一个终端中,运行客户端。这次,添加一个名称作为命令行参数

    go run greeter_client/main.go --name=Alice
    

    您将看到以下输出

    Greeting: Hello Alice
    Greeting: Hello again Alice
    

下一步