我有以下代码: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)
问题在于基础错误的类型丢失了,因此根据错误进行某些操作的唯一方法是字符串比较(这是不可靠的)。
我希望这个答案将是有用的。
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消