go - Golang gRPC 无法保持活动状态:客户端连接正在关闭
问题描述
嗨,我正在尝试将 gRPC 客户端连接到服务器,但即使连接成功,我在从 graphql 解析器查询它时也会收到以下错误。但是,如果我直接从解析器拨号,一切正常,所以它与客户端不保持连接打开有关。
rpc 错误:代码 = 已取消 desc = grpc:客户端连接正在关闭
客户端.go
var kacp = keepalive.ClientParameters{
Time: 10 * time.Second, // send pings every 10 seconds if there is no activity
Timeout: time.Second, // wait 1 second for ping back
PermitWithoutStream: true, // send pings even without active streams
}
func gqlHandler() http.HandlerFunc {
conn, err := grpc.Dial("127.0.0.1:50051", grpc.WithInsecure(),
grpc.WithKeepaliveParams(kacp),
grpc.WithBlock())
if err != nil {
panic(err)
}
defer conn.Close()
db := proto.NewPlatformDBClient(conn)
gh := handler.GraphQL(platform.NewExecutableSchema(platform.Config{Resolvers: &platform.Resolver{
DB: db,
}}))
gh = cors.Disable(gh)
return gh
}
解决方案
这是因为该
defer conn.Close()
命令将在连接使用之前执行。
defer 语句将函数调用推送到列表中。保存的调用列表在周围函数返回后执行。
因此,您将删除该线路defer conn.Close()
并在不再使用后关闭连接。
推荐阅读
- javascript - 在 React/ES6 中将对象键迭代到数组
- regex - 如何在正则表达式中添加条件语句
- reactjs - 如何清理 Next.js / React / Chrome 中的缓存?
- wordpress - Woocommerce B2B 销售代理的付款方式有条件佣金
- c# - 如何在 Core 2.1 中引用 EF(Database First Approach)项目程序集
- c++ - 如何在模板中为 ctor 定义默认值
- typescript - TypeScript 如何将 typeof 与通用原型一起使用?
- python - Pandas 基于其他 2 列创建新列
- php - 有没有更好的方法从 WooCommerce 中的订单中获取运输方式元/设置?
- python - 将数千个项目添加到表格小部件而不冻结窗口