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 | 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
{
  optional uint32 id_message = 1;
}

message RemoveSubscriber
{
  optional 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
    {
      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;
}

Évolutions

  • 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.
  • Pour des raisons historiques et de maintenance, il est déconseillé d'utiliser un champ required et toujours optional. Car un champ required peut évoluer et devenir optional au profit d'un autre.
  • [packed=true] de proto2 est par défaut dans toutes les répétitions dans proto3.

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.1534599658.txt.gz · Dernière modification : 2018/08/18 15:40 de root