gRPC pour JavaScript (Node.js) : bibliothèques et exemples
\n\ngRPC est un framework haute performance pour l'appel de procédures à 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 fiables avec un typage strict, la prise en charge du streaming et de la communication bidirectionnelle. Dans cet article, nous examinerons les principales bibliothèques pour travailler avec gRPC en JavaScript (Node.js) et analyserons un exemple pratique de serveur et de client.
\n\nBibliothèques principales pour gRPC dans Node.js
\n\nPour travailler avec gRPC dans Node.js, deux paquets principaux sont utilisés :
\n\n- \n
- @grpc/grpc-js — une implémentation pure JavaScript de gRPC. Elle ne nécessite pas de dépendances natives, fonctionne sur toutes les plateformes et prend en charge toutes les fonctionnalités de gRPC (appels unaires, streaming serveur et client, streaming bidirectionnel). \n
- @grpc/proto-loader — un utilitaire pour charger les fichiers
.protoà l'exécution. Il permet de créer dynamiquement des objets JavaScript à partir des définitions Protobuf. \n
Pour compiler les fichiers .proto en modules statiques, on peut utiliser grpc-tools (partie de grpc-tools), mais dans les projets modernes, on préfère souvent le chargement dynamique via @grpc/proto-loader.
Installation des dépendances
\n\nnpm install @grpc/grpc-js @grpc/proto-loader\n\nExemple : définition d'un fichier Proto
\n\nCréons un fichier helloworld.proto avec un service simple :
syntax = "proto3";\n\npackage helloworld;\n\nservice Greeter {\n rpc SayHello (HelloRequest) returns (HelloReply) {}\n}\n\nmessage HelloRequest {\n string name = 1;\n}\n\nmessage HelloReply {\n string message = 1;\n}\n\nPartie serveur (Node.js)
\n\nCréons un fichier server.js :
const grpc = require('@grpc/grpc-js');\nconst protoLoader = require('@grpc/proto-loader');\nconst path = require('path');\n\nconst PROTO_PATH = path.join(__dirname, 'helloworld.proto');\n\nconst packageDefinition = protoLoader.loadSync(PROTO_PATH, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true\n});\n\nconst helloProto = grpc.loadPackageDefinition(packageDefinition).helloworld;\n\nfunction sayHello(call, callback) {\n const name = call.request.name || 'Invité';\n callback(null, { message: `Bonjour, ${name} !` });\n}\n\nfunction main() {\n const server = new grpc.Server();\n server.addService(helloProto.Greeter.service, { sayHello: sayHello });\n server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {\n console.log('Serveur gRPC démarré sur le port 50051');\n server.start();\n });\n}\n\nmain();\n\nPartie cliente (Node.js)
\n\nCréons un fichier client.js :
const grpc = require('@grpc/grpc-js');\nconst protoLoader = require('@grpc/proto-loader');\nconst path = require('path');\n\nconst PROTO_PATH = path.join(__dirname, 'helloworld.proto');\n\nconst packageDefinition = protoLoader.loadSync(PROTO_PATH, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true\n});\n\nconst helloProto = grpc.loadPackageDefinition(packageDefinition).helloworld;\n\nfunction main() {\n const client = new helloProto.Greeter('localhost:50051',\n grpc.credentials.createInsecure());\n\n const userName = process.argv[2] || 'Monde';\n\n client.sayHello({ name: userName }, (error, response) => {\n if (error) {\n console.error('Erreur :', error.message);\n return;\n }\n console.log('Réponse du serveur :', response.message);\n });\n}\n\nmain();\n\nLancement et test
\n\nLancez le serveur dans un terminal :
\n\nnode server.js\n\nDans un autre terminal, exécutez le client :
\n\nnode client.js Jean\n\nVous dev
Aussi dans la bibliothèque
Journalisation pour TypeScript : la bibliothèque Winston
Travail avec les dates en Swift (iOS/macOS) : bibliothèques et frameworks
Mise en cache en Go (Golang) : Redis, mise en cache groupée et en mémoire
Test en Java : frameworks et outils (JUnit, TestNG, Mockito)
Bibliothèque WebSocket Java : Tyrus — implémentation JSR 356 pour le temps réel