gRPC pour JavaScript (Node.js) : bibliothèques et exemples
gRPC est un framework haute performance pour l'appel de procédure à distance (RPC), développé par Google. Il utilise Protocol Buffers (protobuf) pour la sérialisation des données et HTTP/2 pour le transport. Dans l'écosystème Node.js, gRPC permet de créer des microservices rapides et fiables avec prise en charge du streaming bidirectionnel. Dans cet article, nous allons passer en revue les bibliothèques principales, l'installation et rédiger un exemple fonctionnel de serveur et de client.
Bibliothèques principales pour gRPC dans Node.js
Pour travailler avec gRPC dans l'environnement Node.js, il existe plusieurs paquets clés :
@grpc/grpc-js— une implémentation pure de gRPC en JavaScript. Ne nécessite pas de dépendances natives (C++), ce qui simplifie l'installation. Recommandé pour la plupart des projets modernes.@grpc/proto-loader— un chargeur de fichiers.proto. Convertit les définitions protobuf en objets JavaScript pour une utilisation avec@grpc/grpc-js.protobufjs— une bibliothèque alternative pour travailler avec protobuf. Prend en charge la génération de code statique et dynamique.grpc-tools— des outils CLI pour générer du code JavaScript à partir de fichiers.proto(alternative au chargement dynamique).
Dans ce guide, nous utiliserons la combinaison @grpc/grpc-js et @grpc/proto-loader — une approche moderne et stable.
Installation des dépendances
Créez un nouveau projet et installez les paquets nécessaires :
mkdir grpc-node-examplecd grpc-node-examplenpm init -ynpm install @grpc/grpc-js @grpc/proto-loaderDéfinition du service via un fichier .proto
Créez un fichier hello.proto avec la description du service et des messages :
syntax = "proto3";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} rpc SayHelloStream (HelloRequest) returns (stream HelloReply) {}}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Ici, nous avons défini deux méthodes : un appel unaire simple SayHello et un streaming serveur SayHelloStream.
Implémentation du serveur gRPC sur Node.js
Créez un fichier server.js :
const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = './hello.proto';
// Charge la définition du fichier protoconst packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true});
const helloProto = grpc.loadPackageDefinition(packageDefinition).helloworld;
// Implémentation des méthodes du servicefunction sayHello(call, callback) { const name = call.request.name; console.log(`Requête reçue : ${name}`); callback(null, { message: `Bonjour, ${name} !` });}
function sayHelloStream(call) { const name = call.request.name; console.log(`Streaming pour : ${name}`);
// Envoie plusieurs réponses for (let i = 0; i < 5; i++) { call.write({ message: `Bonjour ${name} - message ${i + 1}` }); } call.end();}
// Démarrage du serveurfunction main() { const server = new grpc.Server(); server.addService(helloProto.Greeter.service, { sayHello: sayHello, sayHelloStream: sayHelloStream });
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { console.log('Serveur gRPC en cours d'exécution sur le port 50051'); server.start(); });}
main();Implémentation du client gRPC sur Node.js
Créez un fichier client.js :
const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = './hello.proto';
const packageDefini