2017-05-03 1 views

Répondre

1

Protobuf ne fait pas de distinction entre les deux! Considérons les deux messages suivants:

message Foo { 
    int32 foo = 5; 
} 

message Bar { 
    int32 bar = 5; 
} 

Ces deux messages apparaissent être exactement la même chose. La raison en est que le message ne contient pas le schéma . Cela rend les messages plus compacts et plus rapides à traiter, avec le risque mineur d'être éventuellement mal interprété.

Si vous utilisez gRPC, les messages peuvent sembler identiques, mais ils peuvent être distingués par le service auquel ils sont envoyés. Par exemple:

service MyService { 
    rpc EatTheFoo(Foo) returns (Bar); 
} 
service YourService { 
    rpc GoToTheBar(Bar) returns (foo); 
} 

Même si les services prennent et reçoivent des messages qui semblent être les mêmes, GRPC comprendra le nom du service et le message lors de l'envoi du message. Sous le capot, il se transforme en un HTTP/2 demande qui ressemble à:

POST /MyService/EatTheFoo HTTP/2

qui est ensuite suivi par le message Foo. Si quelqu'un essayait accidentellement d'envoyer un message Bar, le serveur verrait que le nom de la méthode était erroné et rejetterait le RPC. Ainsi, la chance d'être mal interprété est assez petite.

+0

Merci beaucoup. Cela explique très bien. – Theodor