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 mod
的replace
特性为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版本是require
d,在包含生成的.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正在使用的连接已关闭,可能有许多原因,包括:
- mis-configured传输凭据,握手时连接失败
- 字节被中断,可能是中间的代理
- server shutdown
- Keepalive参数导致连接关闭,例如,如果您已将服务器配置为定期终止连接以触发DNS查找。如果是这种情况,您可能需要增加MaxConnectionAgeGrace,以允许更长的RPC调用完成。
调试它可能很棘手,因为错误发生在客户端,但关闭连接的根本原因在服务器端。打开客户端和服务器上的日志记录,查看是否有任何传输错误。