« Utilisateur:Alexandre Desbos » : différence entre les versions
mAucun résumé des modifications |
|||
Ligne 53 : | Ligne 53 : | ||
//On définit un service |
//On définit un service |
||
service |
service Inscription { |
||
rpc |
rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse); |
||
} |
} |
||
//On définit les types de message |
//On définit les types de message |
||
//La |
//La requète attend un entier et une chaine de caractère |
||
message |
message InscriptionRequest { |
||
int32 |
int32 annee = 1; |
||
string |
string nom = 2; |
||
} |
} |
||
//La |
//La reponse sera une chaine de caractère |
||
message |
message InscriptionResponse { |
||
string message = 1; |
string message = 1; |
||
} |
} |
||
Ligne 87 : | Ligne 87 : | ||
import concurrent |
import concurrent |
||
from concurrent import futures |
from concurrent import futures |
||
#On importe les fichiers généré par le compilateur protoc |
#On importe les fichiers généré par le compilateur protoc |
||
import |
import USMB_pb2 |
||
import |
import USMB_pb2_grpc |
||
#On définit la fonction réponse du serveur |
#On définit la fonction réponse du serveur |
||
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer): |
|||
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer): |
|||
def |
def InscriptionUSMB(self, request, context): |
||
print(' |
print('requête reçu') |
||
response = |
response = USMB_pb2.InscriptionResponse() |
||
response.message = f" |
response.message = f"Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l'univesité de Savoie" |
||
return response |
return response |
||
#On |
#On définit un serveur sur le port 50051 |
||
def main(): |
def main(): |
||
server = grpc.server(futures.ThreadPoolExecutor(max_workers= |
server = grpc.server(futures.ThreadPoolExecutor(max_workers=5)) |
||
USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server) |
|||
ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(), server) |
|||
print(' |
print('Serveur lancé. En écoute sur le port 50051') |
||
server.add_insecure_port('[::]:50051') |
server.add_insecure_port('[::]:50051') |
||
server.start() |
server.start() |
||
server.wait_for_termination() |
server.wait_for_termination() |
||
main() |
main() |
||
Ligne 121 : | Ligne 122 : | ||
const grpc = require('grpc'); |
const grpc = require('grpc'); |
||
//On imoporte les fichiers javascript géneré par le compilateur |
//On imoporte les fichiers javascript géneré par le compilateur |
||
const messages = require('./ |
const messages = require('./USMB_pb'); |
||
const services = require('./ |
const services = require('./USMB_grpc_pb'); |
||
// |
//On se connecte au serveur |
||
function main() { |
function main() { |
||
const client = new services. |
const client = new services.InscriptionClient( |
||
'localhost:50051', grpc.credentials.createInsecure() |
'localhost:50051', grpc.credentials.createInsecure() |
||
); |
); |
||
//On rentre nos valeurs d'entrée |
|||
//On définit les variables que l'on va envoyer au serveur |
|||
const |
const InscriptionRequest = new messages.InscriptionRequest(); |
||
InscriptionRequest.setAnnee(3); |
|||
InscriptionRequest.setNom('Alexandre Desbos'); |
|||
iceCreamRequest.setFlavor('strawberry'); |
|||
//On |
//On regarde si il y a une erreur |
||
client. |
client.inscriptionUSMB(InscriptionRequest, function (err, response) { |
||
if (err) { |
if (err) { |
||
console.log(' |
console.log('Il y a une erreur', err); |
||
} else { |
} else { |
||
console.log(' |
console.log('réponse de python:', response.getMessage()); |
||
} |
} |
||
}) |
}) |
||
} |
} |
||
main(); |
main(); |
||
Version du 3 mai 2021 à 22:37
Etude du protocole gRPC
Etudiant : Alexandre Desbos
Tuteur : David Télisson
Introduction
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[1] basé sur deux technologie qui sont HTTP/2 et protocol Buffers. Cette technologie est utilisé notamment pour la création d’API[2].
Les technologies du protocole gRPC
RPC
Le RPC[3], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.
Protocol buffer
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.
HTTP/2
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C'est un protocole de communication client-serveur, son objectif est d'améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[4] et le multiplexage.
Comparaison de gRPC et REST
Application
Objectif
Dans cette partie, nous allons implémenter un PoC[5] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents.
Installation
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.
$pip install grpcio
$pip install grpc-tools
$npm install -g request
$npm config set unsafe-perm true
$npm install protoc-gen-grpc -g
$npm install grpc
$npm install google-protobuf
écrire le fichier proto
La première chose pour une application en gRPC est de crée un fichier .proto
//version de la syntaxe syntax = "proto3"; //On définit un service service Inscription { rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse); } //On définit les types de message //La requète attend un entier et une chaine de caractère message InscriptionRequest { int32 annee = 1; string nom = 2; } //La reponse sera une chaine de caractère message InscriptionResponse { string message = 1; }
géneration du code
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:
$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto
$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto
$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto
création du serveur
On implemente maintenant un serveur en python.
import grpc import concurrent from concurrent import futures #On importe les fichiers généré par le compilateur protoc import USMB_pb2 import USMB_pb2_grpc #On définit la fonction réponse du serveur class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer): def InscriptionUSMB(self, request, context): print('requête reçu') response = USMB_pb2.InscriptionResponse() response.message = f"Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l'univesité de Savoie" return response #On définit un serveur sur le port 50051 def main(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=5)) USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server) print('Serveur lancé. En écoute sur le port 50051') server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() main()
création du client
On implémente un client en javascript.
const grpc = require('grpc'); //On imoporte les fichiers javascript géneré par le compilateur const messages = require('./USMB_pb'); const services = require('./USMB_grpc_pb'); //On se connecte au serveur function main() { const client = new services.InscriptionClient( 'localhost:50051', grpc.credentials.createInsecure() ); //On rentre nos valeurs d'entrée const InscriptionRequest = new messages.InscriptionRequest(); InscriptionRequest.setAnnee(3); InscriptionRequest.setNom('Alexandre Desbos'); //On regarde si il y a une erreur client.inscriptionUSMB(InscriptionRequest, function (err, response) { if (err) { console.log('Il y a une erreur', err); } else { console.log('réponse de python:', response.getMessage()); } }) } main();
Sources
https://grpc.io/
https://developers.google.com/protocol-buffers