拨打 gRPC 服务器时如何获得上次连接错误?
How do I get last connection error when dialling gRPC server?
我有以下代码:
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
.
我试过以下方法:
- 使用
grpc.FailOnNonTempDialError(true)
- 当服务不可用时返回错误,但当TLS验证失败时,重新连接继续。
- 使用
grpc.WithContextDialer(...)
- 对我不起作用,因为有时初始拨号成功,但如果服务器证书验证失败,整个连接将关闭。
我怎样才能得到最后的连接错误?
经过一番研究,我决定更新grpc包版本。我使用的是 v1.27.0,最新的是 v1.35.0。在这些版本之间,问题得到解决并引入了新的拨号选项:
grpc.WithReturnConnectionError()
现在好多了,但还有改进的余地。目前,lastError 和上下文错误是这样组合的:
conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err)
问题是底层错误的类型丢失了,所以根据错误采取一些行动的唯一方法是字符串比较(这是不可靠的)。
希望回答对您有用。
我有以下代码:
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
.
我试过以下方法:
- 使用
grpc.FailOnNonTempDialError(true)
- 当服务不可用时返回错误,但当TLS验证失败时,重新连接继续。 - 使用
grpc.WithContextDialer(...)
- 对我不起作用,因为有时初始拨号成功,但如果服务器证书验证失败,整个连接将关闭。
我怎样才能得到最后的连接错误?
经过一番研究,我决定更新grpc包版本。我使用的是 v1.27.0,最新的是 v1.35.0。在这些版本之间,问题得到解决并引入了新的拨号选项:
grpc.WithReturnConnectionError()
现在好多了,但还有改进的余地。目前,lastError 和上下文错误是这样组合的:
conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err)
问题是底层错误的类型丢失了,所以根据错误采取一些行动的唯一方法是字符串比较(这是不可靠的)。
希望回答对您有用。