Service Mesh pour microservices C++ : comment dompter le zoo

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi les microservices C++ ne s'entendent pas avec le réseau (et comment le service mesh corrige cela)

\n\n

Imaginez : vous avez construit un pipeline idéal en C++. Chaque microservice vole, la mémoire est gérée de manière stricte, et la vitesse dépasse le bien et le mal. Mais dès que vous déployez tout cela dans Kubernetes, l'enfer commence. Timeouts, tentatives, ruptures de connexion, perte de paquets. Vous fouillez le code, insérez curl dans tous les coins, écrivez vos propres solutions de bricolage pour les tentatives — et le projet se transforme en marécage.

\n\n

Ça vous parle ? Bienvenue dans le monde des systèmes distribués. La bonne nouvelle : le problème est résolu par le service mesh. La mauvaise : la plupart des tutoriels sont écrits pour Go ou Java. Que faire nous, développeurs C++, qui ne voulons pas traîner un lourd Istio avec Envoy, si nous pouvons créer une solution légère et compréhensible ?

\n\n

Dans cet article, nous allons voir comment implémenter un service mesh pour des microservices C++ sans douleur ni dépendances superflues. Vous apprendrez ce qu'est un proxy sidecar, comment configurer l'équilibrage de charge et l'observabilité, et vous obtiendrez un exemple de code réel en C++ avec gRPC.

\n\n

Qu'est-ce qu'un service mesh et pourquoi est-il utile pour les projets C++ ?

\n\n

Service mesh est une couche d'infrastructure dédiée à la gestion du trafic réseau entre les microservices. Au lieu d'intégrer la logique des timeouts, tentatives, équilibrage de charge et chiffrement dans chaque service, vous la déportez dans un conteneur proxy (sidecar) qui s'exécute à côté de chaque instance de votre service.

\n\n

Pour le C++, c'est particulièrement pertinent car :

\n
    \n
  • Le code C++ est généralement écrit pour des systèmes à forte charge, où chaque microseconde compte ;
  • \n
  • La logique réseau intégrée complique la maintenance et les tests ;
  • \n
  • La bibliothèque standard C++ ne fournit pas de mécanismes prêts à l'emploi pour le service mesh (contrairement à Go avec ses clients HTTP standards).
  • \n
\n\n

Les composants principaux du service mesh :

\n
    \n
  • Data plane — les serveurs proxy (généralement Envoy, mais on peut aussi utiliser les siens en C++) ;
  • \n
  • Control plane — la couche de gestion (par exemple, Istio, Consul, ou une solution maison).
  • \n
\n\n

Nous nous concentrerons sur le data plane, car c'est là que le C++ montre sa force.

\n\n

Écrire notre propre proxy sidecar en C++ (exemple minimal)

\n\n

Supposons que nous ayons deux microservices : auth_service et user_service. Ils communiquent via gRPC. Sans service mesh, chaque service doit gérer lui-même les reconnexions, les timeouts et les métriques. Avec un proxy, ce n'est pas le cas.

\n\n

Voici un exemple minimal de proxy sidecar en C++ utilisant la bibliothèque libcurl et nlohmann/json. Il reçoit des requêtes HTTP, les proxyfie vers le backend, ajoute des tentatives et journalise les latences.

\n\n
// proxy.cpp\n#include <httplib.h>\n#include <nlohmann/json.hpp>\n#include <curl/curl.h>\n#include <chrono>\n#include <thread>\n\nusing json = nlohmann::json;\nusing namespace std::chrono_literals;\n\nclass SidecarProxy {\npublic:\n    SidecarProxy(const std::string& backend_host, int backend_port, int max_retries = 3)\n        : backend_host_(backend_host), backend_port_(backend_port), max_retries_(max_retries) {}\n\n    void handle_request(const httplib::Request& req, httplib::Response& res) {\n        auto start = std::chrono::high_resolution_clock::now();\n        CURL* curl = curl_easy_init();\n        std::string url = "http://" + backend_host_ + ":" + std::to_string(backend_port_) + req.path;\n        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());\n        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L);\n\n        std::string response_string;\n        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](void* ptr, size_t size, size_t nmemb, void* stream) {\n            ((std::string*)stream)->append((char*)ptr, size * nmemb);\n            return size * nmemb;\n        });\n        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);\n\n        int retries = 0;\n        CURLcode code;\n        d                

Blogs

Book Recommendations