为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
holdtom 2022-08-01 16:55:30
我有以下代码: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(...)如何获取最后一个连接错误?
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

经过进一步的研究,我决定更新gpc软件包版本。我使用的是v1.27.0,最新的是v1.35.0。在这些版本之间,问题已修复,并引入了新的拨号选项:

grpc.WithReturnConnectionError()

现在这是一种更好的方式,但还有改进的余地。目前,lastError 和上下文错误组合在一起,如下所示:

conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err)

问题在于基础错误的类型丢失了,因此根据错误进行某些操作的唯一方法是字符串比较(这是不可靠的)。

我希望这个答案将是有用的。


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信