首页 > 解决方案 > 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
}

标签: gographqlgrpc

解决方案


这是因为该 defer conn.Close() 命令将在连接使用之前执行。

来自 Go 博客

defer 语句将函数调用推送到列表中。保存的调用列表在周围函数返回后执行。

因此,您将删除该线路defer conn.Close()并在不再使用后关闭连接。


推荐阅读