Introduction : REST est mort ? Vive gRPC !
Avez-vous déjà eu l'impression que votre API REST fonctionnait comme un vieux courrier — vous envoyez une requête et attendez une réponse, puis vous devez encore parser du JSON qui pèse plus lourd que les données elles-mêmes ? Si oui, bienvenue dans le monde du gRPC en TypeScript. Cette technologie promet vitesse, rigueur des types et transmission de données en flux. Mais, comme tout outil puissant, gRPC n'est pas une solution miracle. Dans cet article, nous verrons quand il vaut la peine d'être utilisé et quand il est préférable de rester sur du REST classique. Et tout cela, avec des exemples concrets en TypeScript, parce que la théorie sèche, c'est ennuyeux.
Nous parlerons de la façon dont gRPC change la donne dans les microservices, pourquoi Protobuf n'est pas simplement "un format de plus", et comment TypeScript nous aide à ne pas nous perdre dans ce zoo de types. C'est parti !
Qu'est-ce que gRPC et pourquoi s'est-il lié d'amitié avec TypeScript ?
gRPC est un framework d'appel de procédure à distance (RPC) développé par Google. Au lieu d'envoyer des requêtes HTTP avec du JSON, vous définissez des services et des messages dans des fichiers .proto (Protocol Buffers), puis vous générez le code client et serveur. Les principales fonctionnalités : format de données binaire, support des flux (streaming), typage strict et communication bidirectionnelle.
Imaginez maintenant que vous écrivez en TypeScript. Vous avez déjà un typage statique, mais dans une API REST, il se "brise" souvent à la frontière avec le JSON. gRPC en TypeScript résout ce problème de manière radicale : les types sont générés automatiquement à partir des fichiers .proto. Vous ne vous demandez plus ce qui est arrivé dans la réponse — le compilateur TypeScript vous le dira dès la phase de développement.
Pourquoi TypeScript est-il le partenaire idéal pour gRPC ?
- Écosystème de types unifié : Les types Protobuf se transforment en interfaces TypeScript. Fini les
anyetas any. - Autocomplétion : Votre IDE comprend tous les champs des requêtes et réponses.
- Sécurité du refactoring : Vous avez renommé un champ dans
.proto? TypeScript mettra en évidence tous les endroits où il est utilisé.
Quand gRPC en TypeScript est-il le choix des champions ?
Tous les projets n'ont pas besoin de gRPC. Mais il existe des scénarios où il offre un gain de performance et de confort multiplié par 10. Examinons-les dans l'ordre.
1. Microservices en TypeScript : communication interne
Si vous avez 5 à 10 microservices en TypeScript qui communiquent constamment entre eux, gRPC est votre meilleur ami. Imaginez : le service utilisateurs transmet des données au service commandes. Sans gRPC, vous sérialiseriez du JSON, désérialiseriez, vérifieriez les types manuellement. Avec gRPC, cela se fait au niveau du protocole.
Exemple d'un service simple :
// user.protoservice UserService { rpc GetUser (GetUserRequest) returns (User);}
message GetUserRequest { string user_id = 1;}
message User { string id = 1; string name = 2; string email = 3;}Après la génération du code, vous obtenez un client strictement typé :
import { UserServiceClient } from './generated/user_grpc_pb';import { GetUserRequest } from './generated/user_pb';
const client = new UserServiceClient('localhost:50051', grpc.credentials.createInsecure());
const request = new GetUserRequest();request.setUserId('123');
client.getUser(request, (error, user) => { if (!error) { console.log(user.getName()); // TypeScript sait que c'est une string }});Quand l'utiliser : lorsque chaque milliseconde de latence entre les services est critique (par exemple, dans les systèmes financiers ou les serveurs de jeux).
2. Transmission de données en flux (Streaming)
REST ne sait pas bien diffuser en continu. WebSocket le sait, mais c'est un autre protocole. gRPC prend en charge quatre types de flux : unidirectionnel (client->serveur), serveur (serveur->client) et bidirectionnel