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

时间:2017-05-03 08:04:01

标签: protocol-buffers protobuf-net grpc grpc-java

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

感谢您的建议 西奥

1 个答案:

答案 0 :(得分:2)

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

message Foo {
  int32 foo = 5; 
}

message Bar {
  int32 bar = 5; 
}

这两条消息看起来完全一样。原因是该消息不带有架构。这使得消息更紧凑,处理速度更快,可能会被误解的轻微缺点。

如果您使用的是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。因此,被误解的可能性非常小。