Qu'est-ce que gRPC-web et quels sont ses avantages ?
gRPC-web est une solution client web pour le framework gRPC. Elle permet aux applications tournant dans un navigateur de communiquer directement avec un serveur gRPC, sans passer par une couche de conversion complexe. Elle utilise le protocole HTTP/1.1 ou HTTP/2, et peut fonctionner sans proxy dédié (bien que certaines fonctionnalités avancées puissent nécessiter Envoy).
- Protocole binaire performant : les données sont sérialisées avec Protocol Buffers, plus compact et rapide à analyser que le JSON.
- Interfaces fortement typées : les services sont définis dans des fichiers
.proto, offrant une vérification de type à la compilation. - Génération automatique de code : les clients JavaScript ou TypeScript sont générés automatiquement, réduisant le travail manuel.
- Support du streaming bidirectionnel : communication temps réel entre client et serveur.
- Compatibilité avec l'écosystème gRPC existant : s'intègre facilement avec les services gRPC déjà en place.
Installation de l'environnement de développement
Assurez-vous d'avoir Node.js et npm. Installez l'outil gRPC-web globalement :
npm install -g grpc-web
Clonez le dépôt officiel pour avoir les exemples :
git clone https://gitcode.com/gh_mirrors/gr/grpc-web && cd grpc-web
npm install
Concepts clés : définition des services et generation de code
Les services sont décrits dans des fichiers .proto avec la syntaxe protobuf. Exemple minimal :
syntax = "proto3";
service EchoService {
rpc Echo(EchoRequest) returns (EchoResponse);
}
message EchoRequest {
string message = 1;
}
message EchoResponse {
string message = 1;
}
Pour générer le code client JavaScript :
protoc -I=$DIR echo.proto \
--js_out=import_style=commonjs:$OUT_DIR \
--grpc-web_out=import_style=commonjs,mode=grpcwebtext:$OUT_DIR
Construire une application web complète : l'exemple Echo
1. Définir le service
Créez un fichier echo.proto avec les services Echo (unaire) et ServerStreamingEcho (streaming serveur).
2. Générer le code client
Utilisez la commande protoc avec les plugins.
3. Client web HTML/JavaScript
<html>
<head>
<title>Exemple Echo avec gRPC-web</title>
</head>
<body>
<input type="text" id="msg" placeholder="Votre message">
<button onclick="envoyerMessage()">Envoyer</button>
<div id="resultat"></div>
<script src="client/echo_grpc_web_pb.js"></script>
<script src="client/echo_pb.js"></script>
<script>
const clientEcho = new echo.EchoServiceClient('http://localhost:8080');
function envoyerMessage() {
const texte = document.getElementById('msg').value;
const requete = new echo.EchoRequest();
requete.setMessage(texte);
clientEcho.echo(requete, {}, (erreur, reponse) => {
const zoneResultat = document.getElementById('resultat');
if (erreur) {
zoneResultat.innerText = `Erreur : ${erreur.message}`;
} else {
zoneResultat.innerText = `Réponse : ${reponse.getMessage()}`;
}
});
}
</script>
</body>
</html>
4. Serveur Node.js et proxy Envoy
L'exemple net/grpc/gateway/examples/echo/node-server/server.js fournit un serveur gRPC. Lancez-le avec node server.js. Configurez Envoy avec le fichier envoy.yaml fourni et démarrez-le :
envoy -c envoy.yaml
5. Tester
Ouvrez la page HTML dans votre navigateur, saisissez un message et cliquez sur le bouton. La réponse du serveur s'affiche.
Fonctionnalités avancées
Streaming serveur
const flux = clientEcho.serverStreamingEcho(requete, {});
flux.on('data', (reponse) => console.log('Message reçu :', reponse.getMessage()));
flux.on('end', () => console.log('Flux terminé'));
flux.on('error', (err) => console.error('Erreur de flux :', err));
Intercepteurs
Disponibles dans javascript/net/grpc/web/interceptor.js pour la gestion des requêtes/réponses.
Support TypeScript
La base de code migre vers TypeScript (voir doc/roadmap.md).
Déploiement et optimisation
- Utilisez les proxies in-process pour éviter Envoy en production.
- Configurez les en-têtes CORS.
- Activez HTTP/2 pour de meilleures performances.
- Préférez le mode binaire
grpcwebau mode texte. - Optimisez la structure des messages protobuf.
- Implémentez un cache client pour les données fréquentes.
Problèmes fréquents
CORS
Assurez-vous que le serveur répond avec les en-têtes CORS appropriés.
Compatibilité navigateur
Tous les navigateurs modernes sont supportés. Voir doc/browser-features.md pour les polyfills.
Débogage
Activez le mode verbeux :
const options = { 'grpc.verbose': true };
Utilisez la console développeur pour isnpecter les appels.
Ressources pour continuer
- Documentation officielle :
doc/ - Exemples :
net/grpc/gateway/examples/ - Tests :
packages/grpc-web/test/
Les futures versions apporteront le streaming bidirectionnel et l'intégration WebTransport. Consultez roadmap.md pour les nouveautés.