prog:protobuf
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| prog:protobuf [2018/08/18 15:16] – Complétion de Protocol Buffers root | prog:protobuf [2018/09/22 22:59] (Version actuelle) – [Protocol Buffers] : ajout de "Emplacement du .pb.* généré" root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====Protocol Buffers==== | + | =====Protocol Buffers===== |
| - | ===Cas simple=== | + | ====Cas simple==== |
| - | Le format de base est simple. [[https:// | + | Le format de base est simple. [[https:// |
| Ici, on crée deux messages '' | Ici, on crée deux messages '' | ||
| Ligne 12: | Ligne 12: | ||
| message AddSubscriber | message AddSubscriber | ||
| { | { | ||
| - | | + | uint32 id_message = 1; |
| } | } | ||
| message RemoveSubscriber | message RemoveSubscriber | ||
| { | { | ||
| - | | + | uint32 id_message = 1; |
| } | } | ||
| </ | </ | ||
| - | ===Import=== | + | ====Import==== |
| Il est possible de créer des structures plus complexes avec des sous niveaux et d' | Il est possible de créer des structures plus complexes avec des sous niveaux et d' | ||
| Ligne 41: | Ligne 41: | ||
| oneof data | 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; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====Subtilités==== | ||
| + | ===Emplacement du .pb.* généré=== | ||
| + | Si le fichier '' | ||
| + | |||
| + | Généré dans le dossier '' | ||
| + | / | ||
| + | |||
| + | Généré dans '' | ||
| + | / | ||
| + | |||
| + | ====Évolutions==== | ||
| + | * proto2 : | ||
| + | * Il faut toujours mettre '' | ||
| + | * Mettre '' | ||
| + | * proto3 : | ||
| + | * Si un champ devient déprécié mais est encore supporté, ajouter '' | ||
| + | * Si un champ n'est définitivement plus utilisé, remplacer la ligne avec son identifiant par '' | ||
| + | * 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 '' | ||
| + | |||
| + | Soit une classe Greeter avec une procédure RPC '' | ||
| + | |||
| + | < | ||
| + | service Greeter { | ||
| + | rpc Talk (stream Rpc) returns (stream Rpc) {} | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Soit l' | ||
| + | < | ||
| + | syntax = " | ||
| + | |||
| + | import " | ||
| + | |||
| + | 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.AddSubscriber add_subscriber = 1; | ||
| optional llgc.protobuf.pattern.publisher.RemoveSubscriber remove_subscriber = 2; | optional llgc.protobuf.pattern.publisher.RemoveSubscriber remove_subscriber = 2; | ||
| Ligne 46: | Ligne 109: | ||
| } | } | ||
| } | } | ||
| + | | ||
| repeated Msg msg = 1; | repeated Msg msg = 1; | ||
| } | } | ||
| </ | </ | ||
| - | ===Évolutions=== | + | ===Serveur=== |
| + | Il faut implémenter une classe héritant la classe de service. | ||
| - | * Si un champ n' | + | <code cpp> |
| - | | + | class GreeterImpl : public llgc:: |
| - | * Pour des raisons historiques et de maintenance, il est déconseillé d'utiliser un champ '' | + | { |
| - | | + | // La méthode par défaut renvoie UNIMPLEMENTED. |
| - | * Si un champ devient déprécié, ajouter '' | + | // À chaque fois qu'un client appelle cette méthode, |
| + | // le serveur lance un thread pour exécuter la fonction Talk. | ||
| + | // Il peut y avoir en simultanée autant de threads que de clients. | ||
| + | // Tant que cette méthode | ||
| + | | ||
| + | // Tous les threads travaillent | ||
| + | | ||
| + | :: | ||
| + | :: | ||
| + | { | ||
| + | :: | ||
| + | // Tant que le client n'a pas fermé la connexion, on reste dans | ||
| + | // l' | ||
| + | while (stream-> | ||
| + | { | ||
| + | // Ici, on répond au message. | ||
| + | stream-> | ||
| + | |||
| + | // La réponse | ||
| + | // fonction doit faire. | ||
| + | } | ||
| + | |||
| + | // Fermeture de la connexion à l'initiative du serveur. | ||
| + | // Dans notre cas précis, le client a déjà terminé puisque | ||
| + | // stream-> | ||
| + | return grpc:: | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Pour instancier le serveur | ||
| + | GreeterImpl service; | ||
| + | // Le builder n'a besoin d'exister que jusqu'à la commande BuildAndStart. | ||
| + | ServerBuilder builder; | ||
| + | builder.AddListeningPort(" | ||
| + | builder.RegisterService(& | ||
| + | // La variable service doit exister tant que l'instance du serveur existe. | ||
| + | std:: | ||
| + | // Lancement du serveur. Fonction bloquante. | ||
| + | // Peut être lancée dans un thread. | ||
| + | server-> | ||
| + | // Pour arrêter le serveur (depuis | ||
| + | // ayant lancé la méthode Wait). | ||
| + | server-> | ||
| + | </ | ||
| + | |||
| + | ===Client=== | ||
| + | <code cpp> | ||
| + | // Création du client. | ||
| + | std:: | ||
| + | | ||
| + | grpc:: | ||
| + | std:: | ||
| + | llgc:: | ||
| + | grpc:: | ||
| + | std:: | ||
| + | :: | ||
| + | |||
| + | // Communication avec le serveur. | ||
| + | :: | ||
| + | // Envoie un message au serveur. | ||
| + | stream-> | ||
| + | // Ferme la communication avec le serveur | ||
| + | stream-> | ||
| + | // Attente de la réponse de façon bloquante. | ||
| + | stream-> | ||
| + | // Pour arrêter | ||
| + | context.TryCancel(); | ||
| + | // Ferme la communication. | ||
| + | // L'appel à Finish fait que la fonction stream-> | ||
| + | // va échouer mais ne sera plus bloquante. | ||
| + | if (!stream-> | ||
| + | std::cout << " | ||
| + | </ | ||
prog/protobuf.1534598174.txt.gz · Dernière modification : de root
