Outils pour utilisateurs

Outils du site


prog:protobuf

Ceci est une ancienne révision du document !


Protocol Buffers

Cas simple

Le format de base est simple. Language Guide Proto 2 | Protocol Buffers , Language Guide Proto 3 | Protocol Buffers

Ici, on crée deux messages AddSubscriber et RemoveSubscriber pour le pattern publisher. Dans chaque message, chaque champ doit avoir un identifiant numéraire.

syntax = "proto3";

package llgc.protobuf.pattern.publisher;

message AddSubscriber
{
  uint32 id_message = 1;
}

message RemoveSubscriber
{
  uint32 id_message = 1;
}

Import

Il est possible de créer des structures plus complexes avec des sous niveaux et d'importer les messages d'autres fichiers.

syntax = "proto3";

import "pattern_publisher.proto";

package llgc.protobuf.test;

message Tcp
{
  message Msg
  {
    message Test
    {
    }

    oneof data
    {
      llgc.protobuf.pattern.publisher.AddSubscriber add_subscriber = 1;
      llgc.protobuf.pattern.publisher.RemoveSubscriber remove_subscriber = 2;
      Test test = 3;
    }
  }

  repeated Msg msg = 1;
}

Évolutions

  • proto2 :
    • Il faut toujours mettre optional pour les champs non répétés. Il est déconseillé d'utiliser un champ required car un champ peut évoluer et devenir optional au profit d'un autre. Ces deux champs ont disparu dans proto3 et optional est appliqué.
    • Mettre [packed=true] pour toutes les répétitions. Présent par défaut avec proto3.
  • proto3 :
    • Si un champ devient déprécié mais est encore supporté, ajouter [deprecated=true].
    • Si un champ n'est définitivement plus utilisé, remplacer la ligne avec son identifiant par reserved id;.
    • Les identifiants entre 1 et 15 occupent un octet. Ils sont à privilégier pour les champs répétées. Ceux entre 16 et 2047 sont sur deux octets.

gRPC

Cas simple

Le protocole se déclare dans un fichier .proto.

Soit une classe Greeter avec une procédure RPC Talk. Avec la présences des deux stream, la communication entre le client et le serveur est bidirectionnelle. Les données échangées sont celles du message de type Rpc.

service Greeter {
  rpc Talk (stream Rpc) returns (stream Rpc) {}
}

Soit l'exemple complet :

syntax = "proto3";

import "pattern_publisher.proto";

package llgc.protobuf.test;

service Greeter {
  rpc Talk (stream Rpc) returns (stream Rpc) {}
}

message Rpc
{
  message Msg
  { 
    message Test
    {
    }
    
    oneof data
    { 
      optional llgc.protobuf.pattern.publisher.AddSubscriber add_subscriber = 1;
      optional llgc.protobuf.pattern.publisher.RemoveSubscriber remove_subscriber = 2;
      optional Test test = 3;
    }
  }
  
  repeated Msg msg = 1;
}
prog/protobuf.1534600651.txt.gz · Dernière modification : 2018/08/18 15:57 de root