grpc/grpc-go
GitHub: grpc/grpc-go
gRPC 的官方 Go 语言实现,提供基于 HTTP/2 和 Protobuf 的高性能 RPC 通信能力。
Stars: 22828 | Forks: 4646
# gRPC-Go
[][API]
[](https://goreportcard.com/report/github.com/grpc/grpc-go)
[](https://codecov.io/gh/grpc/grpc-go)
[gRPC][] 的 [Go][] 实现:一个高性能、开源、通用的 RPC 框架,优先支持移动平台和 HTTP/2。欲了解更多信息,请参阅 [Go gRPC docs][],或直接进入 [quick start][]。
## 前置条件
- **[Go][]**:**两个最新主要** [版本][go-releases] 中的任意一个。
## 安装
只需在代码中添加以下导入语句,然后 `go [build|run|test]` 将自动获取必要的依赖项:
```
import "google.golang.org/grpc"
```
## 了解更多
- [Go gRPC docs][],其中包括 [quick start][] 和 [API reference][API] 以及其他资源
- 来自本仓库的 [底层技术文档](Documentation)
- [性能基准测试][Performance benchmark]
- [示例](examples)
- [贡献指南](CONTRIBUTING.md)
## 常见问题
### I/O 超时错误
某些国家/地区可能无法访问 `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 module 的情况下:可以使用 `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 issue #28652](https://github.com/golang/go/issues/28652)。
### 编译错误,undefined: grpc.SupportPackageIsVersion
请使用 `go get google.golang.org/grpc` 更新到 gRPC-Go 的最新版本。
### 如何开启日志
默认 logger 由环境变量控制。像这样开启所有日志:
```
$ export GRPC_GO_LOG_VERBOSITY_LEVEL=99
$ export GRPC_GO_LOG_SEVERITY_LEVEL=info
```
### RPC 失败并显示错误 `"code = Unavailable desc = transport is closing"`
此错误意味着 RPC 使用的连接已关闭,可能的原因有很多,包括:
1. 传输凭据 配置错误,握手失败
2. 字节被干扰,可能是中间的代理造成的
3. 服务器关闭
4. Keepalive 参数导致连接关闭,例如,如果您将服务器配置为定期终止连接以 [触发 DNS 查找](https://github.com/grpc/grpc-go/issues/3170#issuecomment-552517779)。
如果是这种情况,您可能需要增加 [MaxConnectionAgeGrace](https://pkg.go.dev/google.golang.org/grpc/keepalive?tab=doc#ServerParameters),以允许更长的 RPC 调用完成。
调试此问题可能比较棘手,因为错误发生在客户端,但连接关闭的根本原因在服务器端。请开启 __客户端和服务器__ 的日志,看看是否存在任何传输错误。
标签:EVTX分析, Go, Golang, gRPC, HTTP/2, Python工具, RPC框架, Ruby工具, 中间件, 安全编程, 客户端, 序列化, 开发库, 开源库, 搜索引擎爬虫, 日志审计, 服务端, 系统底层, 网络编程, 谷歌, 跨语言, 远程过程调用, 通信协议