gRPC-Go

gRPC的Go实现:一个高性能、开源、通用的RPC框架,将移动和HTTP/2放在首位。有关更多信息,请参阅Go gRPC文档,或直接进入快速入门。

Prerequisites

  • Go:三个最新的主要版本中的任何一个。

Installation

使用Go模块支持(Go1.11+)),只需添加以下导入

import "google.golang.org/grpc"

,然后go [build|run|test]将自动获取所需的依赖项。

否则,要安装grpc-go包,请运行以下命令:

$ go get -u google.golang.org/grpc

注意:如果您试图从中国访问grpc-go,请参阅下面的常见问题解答。

Learn more

  • Go gRPC文档,其中包括快速入门和API参考等其他资源
  • Low-level来自此存储库的技术文档
  • Performance benchmark
  • Examples

FAQ

I/O Timeout Errors

golang.org域可能被某些国家阻止。go get发生这种情况时,通常会产生如下错误:

$ go get -u google.golang.org/grpc
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

要构建Go代码,有几个选项:

  • 设置一个VPN并通过它访问google.golang.org。
  • 没有Go模块支持:git clone手动回购:git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 您需要对golang.org中的所有grpc依赖项执行相同的操作,例如golang.org/x/net
  • 有了Go模块支持:可以使用go modreplace特性为golang.org包创建别名。在项目的目录:go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest go mod tidy go mod vendor go build -mod=vendor 中,同样需要对golang.org上托管的所有可传递依赖项执行此操作。有关详细信息,请参阅golang/go第28652期。

编译错误,未定义:grpc.SupportPackageIsVersion

如果您使用的是Go模块:

确保您的gRPC-Go版本是required,在包含生成的.pb.go文件的同一模块中的相应版本。例如,SupportPackageIsVersion6需要v1.27.0,因此在go.mod文件中:

module <your module name>

require (
    google.golang.org/grpc v1.27.0
)

如果不使用Go模块:

更新proto包、gRPC包,并重新生成.proto文件:

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto

如何打开日志记录

默认记录器由环境变量控制。像这样打开所有东西:

$ export GRPC_GO_LOG_VERBOSITY_LEVEL=99
$ export GRPC_GO_LOG_SEVERITY_LEVEL=info

RPC失败,错误为"code = Unavailable desc = transport is closing"

此错误表示RPC正在使用的连接已关闭,可能有许多原因,包括:

  1. mis-configured传输凭据,握手时连接失败
  2. 字节被中断,可能是中间的代理
  3. server shutdown
  4. Keepalive参数导致连接关闭,例如,如果您已将服务器配置为定期终止连接以触发DNS查找。如果是这种情况,您可能需要增加MaxConnectionAgeGrace,以允许更长的RPC调用完成。

调试它可能很棘手,因为错误发生在客户端,但关闭连接的根本原因在服务器端。打开客户端和服务器上的日志记录,查看是否有任何传输错误。