1

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

4

1 回答 1

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。因此,被误解的可能性很小。

于 2017-05-03T20:54:29.770 回答