protobuff 编译器如何区分不同的服务及其具有相同标识符/标签的消息?

Posted

技术标签:

【中文标题】protobuff 编译器如何区分不同的服务及其具有相同标识符/标签的消息?【英文标题】:How does the protobuff compiler distinguish between different services and their messages with same identifiers/tags? 【发布时间】:2017-05-03 08:04:01 【问题描述】:

问题是关于反序列化过程。我认为第一个字节描述了标签和相应的在线类型。但是如果两个服务在他们的消息中使用相同的标签/标识符和数据类型呢?

【问题讨论】:

【参考方案1】:

Protobuf 实际上并没有区分这两者!考虑以下两条消息:

message Foo 
  int32 foo = 5; 


message Bar 
  int32 bar = 5; 

这两条消息看起来完全一样。原因是消息没有携带 schema。这使得消息更紧凑,处理速度更快,但可能会被误解。

如果您使用的是 gRPC,这些消息可能看起来相同,但可以通过它们发送到哪个服务来区分它们。例如:

service MyService 
  rpc EatTheFoo(Foo) returns (Bar); 

service YourService 
  rpc GoToTheBar(Bar) returns (foo);

即使两个服务接收和接收看似相同的消息,gRPC 也会在发送消息时包含服务的名称和消息。在后台,它将变成一个 HTTP/2 请求,如下所示:

POST /MyService/EatTheFoo HTTP/2

然后是Foo 消息。如果有人不小心尝试发送Bar 消息,服务器会看到方法名称错误并拒绝 RPC。因此,被误解的可能性很小。

【讨论】:

非常感谢。这很好地解释了这一点。

以上是关于protobuff 编译器如何区分不同的服务及其具有相同标识符/标签的消息?的主要内容,如果未能解决你的问题,请参考以下文章

Google ProtoBuff 获取编译使用示例

Golang如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值

ProtoBufferwindows上安装ProtoBuffer3.x (附已编译资源)

如何区分不同服务的指标

多态及实现方式

Protobuffer教程