Introduction : REST est mort ? Vive gRPC !
\nDans le monde du développement Go, le débat est permanent : que choisir pour la communication entre microservices — le bon vieux REST ou le moderne gRPC ? Si vous avez déjà écrit en Go, vous avez sûrement entendu dire que gRPC est « rapide, strict et binaire ». Mais est-ce vraiment le cas ? Et surtout — quand l'utiliser pour ne pas se compliquer la vie ?
\nJe m'appelle [Votre Nom], et je suis développeur Go avec de nombreuses années d'expérience. Aujourd'hui sur PythonLib, nous allons analyser gRPC en Go avec des exemples concrets : où il est indispensable, et où il vaut mieux rester avec REST. C'est parti !
\n\nQu'est-ce que gRPC et pourquoi Go ?
\ngRPC est un framework d'appel de procédure distante (RPC) de Google, utilisant Protocol Buffers (protobuf) pour la sérialisation des données. Go est l'un des langages de « première ligne » de support de gRPC, au même titre que C++ et Java. Pourquoi ?
\n- \n
- Performance : Go se compile en code natif, et protobuf sérialise les données au format binaire beaucoup plus rapidement que JSON. \n
- Simplicité : Un serveur Go avec gRPC s'écrit littéralement en 20 minutes. \n
- Typage statique : Les fichiers .proto génèrent des clients et serveurs fortement typés. \n
Mais le principal — gRPC en Go offre le streaming (transmission en flux) natif. C'est une fonctionnalité killer pour de nombreuses tâches.
\n\nQuand gRPC en Go est votre meilleur ami
\n1. Microservices à forte charge
\nSi vos services échangent des milliers de requêtes par seconde, gRPC brillera de mille feux. Le protocole binaire et HTTP/2 réduisent les latences et la charge processeur.
\nExemple : un service de recommandations en temps réel. Chaque requête est un petit paquet de données, mais il y en a beaucoup. REST avec JSON serait « lourd » et lent.
\n\n2. Streaming de données (mises à jour en direct)
\ngRPC prend en charge quatre types de streaming : server-side, client-side, bidirectionnel. En Go, cela se réalise via les canaux (channels), rendant le code élégant.
\nExemple : un service de monitoring qui envoie des métriques au serveur toutes les 100 ms. REST vous obligerait à maintenir un WebSocket ou à faire du long-polling. gRPC — il suffit d'appeler un stream.
\n\n3. Applications mobiles et IoT
\nLe format binaire de protobuf économise la bande passante et la batterie. Un serveur Go avec gRPC dessert facilement des milliers de clients mobiles.
\n\nQuand gRPC est une complexité inutile
\n1. Applications CRUD simples
\nSi vous avez un serveur web typique avec quelques endpoints (créer un utilisateur, obtenir une liste), gRPC est comme un marteau-pilon pour écraser une mouche. REST + JSON sera plus simple, et la différence de performance est imperceptible.
\n\n2. Clients navigateur
\nLes navigateurs ne supportent pas gRPC directement (uniquement via gRPC-Web, qui ajoute une couche intermédiaire). Pour une SPA en React/Vue, mieux vaut rester sur REST ou GraphQL.
\n\n3. Équipe débutante en Go
\ngRPC nécessite la compréhension de protobuf, des intercepteurs, de l'équilibrage de charge. Si votre équipe débute en Go, commencez par REST — cela abaissera la barrière à l'entrée.
\n\nExemple concret : écrivons un serveur et un client en Go
\nÉcrivons un service simple pour obtenir les informations d'un utilisateur. Cela montrera à quoi ressemble gRPC dans le code.
\n\nÉtape 1 : Définir le fichier .proto
\nsyntax = "proto3";\npackage user;\n\nservice UserService {\n rpc GetUser (UserRequest) returns (UserResponse);\n}\n\nmessage UserRequest {\n int32 id = 1;\n}\n\nmessage UserResponse {\n string name = 1;\n string email = 2;\n}\nCompilation : protoc --go_out=. --go-grpc_out=. user.proto
Étape 2 : Implémenter le serveur en Go
\npackage main\n\nimport (\n "context"\n "log"\n "net"\n "google.golang.org/grpc"\n pb "path/to/your/proto"\n)\n\ntype server struct {\n pb.UnimplementedUserServiceServer\n}\n\nfunc (s *server) GetUser(ctx context.Context, req *pb.UserRequest) (*pb.UserResponse, error) {\n // Simulation de base de données\n users := map[int32]*pb.UserResponse{\n 1: {Name: "Alice",