Microservices en C++ : par où commencer en 2024
\n\nQuand on entend « microservices », on pense généralement à Go, Java ou Python. Mais C++ ? On imagine un langage trop bas niveau, complexe et pas fait pour le web. Pourtant, ces dernières années, le C++ connaît une seconde jeunesse dans le backend : les normes modernes (C++17/20), des frameworks légers et des outils matures en font un excellent choix pour les microservices à forte charge. Si votre projet nécessite une consommation mémoire minimale, des performances maximales ou fonctionne sur ARM/MIPS, le C++ peut être votre atout maître.
\n\nDans cet article, je vais vous montrer par où commencer concrètement : choisir un framework, écrire un service HTTP simple, ajouter gRPC et le tout dans Docker. Pas de blabla, que du code et de la pratique.
\n\n\n\n
Pourquoi le C++ pour les microservices n'est pas une folie ?
\n\nLe principal argument des détracteurs du C++ : « long à écrire, facile de se tromper ». Mais le C++ moderne avec ses pointeurs intelligents, ses conteneurs STL et RAII permet d'écrire presque aussi vite qu'en Go, tout en offrant un contrôle total sur la mémoire. Les avantages sont évidents :
\n\n- \n
- Vitesse — le C++ est 2 à 10 fois plus rapide que Java/Python en opérations d'E/S et en calculs. \n
- Consommation mémoire — un microservice typique en C++ occupe 5-15 Mo contre 50-150 Mo en Java. \n
- Pas de GC — pas de « freeze » du ramasse-miettes, une latence prévisible. \n
- Écosystème — gRPC, Boost, nlohmann/json, Crow, Drogon — tout fonctionne prêt à l'emploi. \n
Il y a aussi des inconvénients : un compilateur plus strict, des builds plus longues, un débogage plus complexe. Mais si vous avez besoin de performances dignes des systèmes financiers, des serveurs de jeux ou de l'IoT, le C++ est justifié.
\n\n\n\n
Choisir son framework : Crow vs Drogon vs Pistache
\n\nPour démarrer rapidement, pas besoin d'écrire un serveur HTTP à partir de zéro avec des sockets. Voici trois options populaires :
\n\n1. Crow (léger, header-only)
\nIdéal pour les microservices de 5 à 10 endpoints. Il suffit d'inclure un seul fichier d'en-tête et c'est prêt. Inconvénient : pas de support HTTP/2, routage limité.
\n\n2. Drogon (complet)
\nLe meilleur choix pour un projet sérieux : HTTP/1.1 et HTTP/2, WebSocket, AOP, gestion de bases de données, ORM. Drogon s'inspire d'ASP.NET et Django — il peut même générer automatiquement du JSON à partir de modèles.
\n\n3. Pistache (moderne mais encore jeune)
\nUne alternative intéressante, mais pas encore stable pour la production.
\n\nJe recommande de commencer avec Crow — minimaliste, il permet d'obtenir une API REST fonctionnelle en 10 minutes. Pour des projets sérieux, orientez-vous vers Drogon.
\n\n\n\n
Pratique : écrivons un microservice en C++ avec Crow
\n\nCréons un service simple qui reçoit un JSON avec un nom d'utilisateur et renvoie un message de bienvenue. C'est un « Hello World » classique, mais dans le style microservice.
\n\nÉtape 1. Installation des dépendances
\nVous aurez besoin de CMake et d'un compilateur supportant C++17 (gcc 9+, clang 10+). Crow étant header-only, il suffit de copier le fichier crow_all.h depuis le dépôt.
# Téléchargement de Crow\nwget https://github.com/CrowCpp/Crow/releases/download/v1.1.0/crow_all.h\n\n\nÉtape 2. Code du service
\n\n// main.cpp\n#include "crow_all.h"\n#include <iostream>\n#include <string>\n\nint main() {\n crow::SimpleApp app;\n\n // GET /hello — vérification de santé\n CROW_ROUTE(app, "/hello")\n ([](){\n return crow::response(200, "Hello, World!");\n });\n\n // POST /greet — reçoit JSON {"name": "Alice"}\n CROW_ROUTE(app, "/greet").methods(crow::HTTPMethod::POST)\n ([](const crow::request& req){\n auto body = crow::json::load(req.body);\n if (!body || !body.has("name")) {\n return crow::response(400, "Bad Request: 'name' manquant");\n }\n std::string name = body["name"].s();\n crow::json::wvalue result;\n result