猿问

拨号 gRPC 服务器时如何获得上次连接错误?

我有以下代码:


dialCtx, cancel := context.WithTimeout(ctx, 120*time.Second)

defer cancel()


conn, err := grpc.DialContext(dialCtx, address,

    grpc.WithTransportCredentials(creds),

    grpc.WithKeepaliveParams(keepAlive),

    grpc.WithBlock(),

)

if err != nil {

    return fmt.Errorf("failed to connect to server: %v", err)

}

我正在尝试创建与gRPC服务器的连接。一件重要的事情是,我正在使用哪个阻止拨号盘,直到连接准备就绪或上下文超时。好的,但是当上下文超时时,我不明白连接问题是什么,也就是最后一个连接错误。我得到.WithBlock()context deadline exceeded


我尝试了以下操作:

  • 使用 - 当服务不可用时返回错误,但当 TLS 验证失败时,重新连接将继续。grpc.FailOnNonTempDialError(true)

  • 使用 - 对我不起作用,因为有时初始拨号成功,但如果服务器证书验证失败,则整个连接将关闭。grpc.WithContextDialer(...)

如何获取最后一个连接错误?


holdtom
浏览 98回答 1
1回答

慕的地6264312

经过进一步的研究,我决定更新gpc软件包版本。我使用的是v1.27.0,最新的是v1.35.0。在这些版本之间,问题已修复,并引入了新的拨号选项:grpc.WithReturnConnectionError()现在这是一种更好的方式,但还有改进的余地。目前,lastError 和上下文错误组合在一起,如下所示:conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err)问题在于基础错误的类型丢失了,因此根据错误进行某些操作的唯一方法是字符串比较(这是不可靠的)。我希望这个答案将是有用的。
随时随地看视频慕课网APP

相关分类

Go
我要回答