【发布时间】:2021-01-19 19:13:50
【问题描述】:
我有一个 GRPC 服务定义如下:
message SendEventRequest {
string producer = 1;
google.protobuf.Any event = 2;
}
message SendEventResponse {
string event_name = 1;
string status = 2;
}
service EventService {
rpc Send(SendEventRequest) returns (SendEventResponse);
}
我还定义了一个自定义消息选项:
extend google.protobuf.MessageOptions {
// event_name is the unique name of the event sent by the clients
string event_name = 50000;
}
我想要实现的是让客户创建自定义原型消息,将event_name 选项设置为“常量”。例如:
message SomeCustomEvent {
option (mypackage.event_name) = "some_custom_event";
string data = 1;
...
}
这样服务就可以跟踪正在发送的事件。当我做这样的事情时,我能够从特定的proto.Message 获取选项的值:
_, md := descriptor.MessageDescriptorProto(SomeCustomEvent)
mOpts := md.GetOptions()
eventName := proto.GetExtension(mOpts, mypackage.E_EventName)
但是,当消息是github.com/golang/protobuf/ptypes/any.Any 类型时,选项为零。如何从邮件中检索event_name?我遇到了protoregistry.MessageTypeResolver,看起来它可能会有所帮助,但我需要找到一种方法来在客户端集成时动态更新事件的原型定义。
【问题讨论】:
-
如果使用 ANY 类型,是不是在 Go 代码中添加了查找发送的类型的功能?或者你不能做一个类型断言?这应该会使静态值变得不必要。
标签: go protocol-buffers any