如何使用 go-grpc 在 gRPC protobuf 消息中包含错误字段

问题描述 投票:0回答:2

我有一个用 Go 编写的 gRPC 服务,它通过将接收到的 gRPC 消息包装到另一个单独的后端服务的 gRPC 消息中来扮演类似代理的角色。该后端服务可以返回错误,但我不想简单地从后端返回

error
类型到代理服务,因为我正在使用流,并且我不想因为单个错误而中止整个流.

相反,我想要做的是返回包含错误字段的响应消息。我目前只是使用这样的字符串字段并通过

ProxiedMessage.err
:
 设置字符串 
fmt.Sprintf("Error encountered: %v", err)

字段
message ProxiedMessage {
  bytes wrappedRpc = 1;
  string err = 2;
}

这对我有用,但我想知道是否有一种“正确”的方法来返回

error
类型作为我应该使用的字段。像这样的东西(不起作用):

message ProxiedMessage {
  bytes wrappedRpc = 1;
  error err = 2;
}
go protocol-buffers grpc grpc-go protobuf-go
2个回答
0
投票

我只需使用对您有意义的任何字段定义错误消息,例如:

message StreamError {
     int32 code = 1;
     string cause = 2;
}

然后将其作为字段包含在流消息中:

message ProxiedMessage {
  bytes wrappedRpc = 1;
  StreamError err = 2;
}

您还可以使用一个简单的枚举,以防您不需要丰富的错误消息。然后将枚举表示的错误代码映射到客户端的一些人类可读的字符串:

enum StreamError {
    Unknown = 0;
    NotFound = 1;
    NotEnoughCoffee = 2;
    ... 
}

message ProxiedMessage {
  bytes wrappedRpc = 1;
  StreamError code = 2;
}

0
投票

在 gRPC-Go 代码库中,您可以使用我们的状态包和错误代码(此处示例:https://github.com/grpc/grpc-go/blob/master/xds/server.go#L364)。但是,从技术上讲,这不是原始响应消息的一部分,并且表示 RPC 失败(错误对象返回到客户端)。对于状态的原型表示,您可以使用此处定义的 google.rpc.status:https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto

© www.soinside.com 2019 - 2024. All rights reserved.