Microservicios en C++: por dónde empezar en 2024
\n\nCuando se oye «microservicios», normalmente vienen a la mente Go, Java o Python. ¿Pero C++? Parece que este lenguaje es demasiado de bajo nivel, complejo y en general no es para la web. Y es una lástima. En los últimos años, C++ está experimentando un renacimiento en el ámbito del backend: los estándares modernos (C++17/20), frameworks ligeros y herramientas maduras lo convierten en una excelente opción para microservicios de alta carga. Si su proyecto requiere un consumo mínimo de memoria, el máximo rendimiento o trabajar en ARM/MIPS, C++ puede ser un as bajo la manga.
\n\nEn este artículo, mostraré por dónde empezar realmente: elegiremos un framework, escribiremos un servicio HTTP simple, añadiremos gRPC y lo envolveremos todo en Docker. Sin rodeos: solo código y práctica.
\n\n\n\n
¿Por qué C++ para microservicios no es una locura?
\n\nEl principal argumento de los detractores de C++: «lleva mucho tiempo escribirlo, es fácil equivocarse». Pero el C++ moderno con punteros inteligentes, contenedores STL y RAII permite escribir casi tan rápido como en Go, a la vez que brinda control total sobre la memoria. Las ventajas son evidentes:
\n\n- \n
- Velocidad — C++ es de 2 a 10 veces más rápido que Java/Python en operaciones de E/S y cálculos. \n
- Consumo de memoria — un microservicio típico en C++ ocupa 5-15 MB frente a los 50-150 MB en Java. \n
- Sin GC — no hay «congelaciones» del recolector de basura, latencia predecible. \n
- Ecosistema — gRPC, Boost, nlohmann/json, Crow, Drogon: todo funciona de fábrica. \n
También hay desventajas: compilador más estricto, compilación más larga, depuración más compleja. Pero si necesita un rendimiento al nivel de sistemas financieros, servidores de juegos o IoT, C++ está justificado.
\n\n\n\n
Elegir framework: Crow vs Drogon vs Pistache
\n\nPara un inicio rápido, no es necesario escribir un servidor HTTP desde cero con sockets. Hay tres opciones populares:
\n\n1. Crow (ligero, solo header)
\nIdeal para microservicios de hasta 5-10 endpoints. Simplemente incluya un archivo de cabecera y ya está. Desventaja: no soporta HTTP/2, enrutamiento débil.
\n\n2. Drogon (completo)
\nLa mejor opción para un proyecto serio: HTTP/1.1 y HTTP/2, WebSocket, AOP, trabajo con bases de datos, ORM. Drogon está inspirado en ASP.NET y Django: incluso puede generar automáticamente JSON a partir de modelos.
\n\n3. Pistache (moderno, pero inmaduro)
\nUna alternativa interesante, pero aún no es estable para producción.
\n\nRecomiendo empezar con Crow — es minimalista y permite tener una API REST funcionando en 10 minutos. Y para proyectos serios, mirar hacia Drogon.
\n\n\n\n
Práctica: escribimos un microservicio en C++ con Crow
\n\nCrearemos un servicio simple que recibe un JSON con el nombre de usuario y devuelve un saludo. Es el clásico «Hello World», pero en estilo microservicio.
\n\nPaso 1. Instalación de dependencias
\nNecesitará CMake y un compilador con soporte para C++17 (gcc 9+, clang 10+). Crow es solo header, así que simplemente copiamos el archivo crow_all.h del repositorio.
# Descargamos Crow\nwget https://github.com/CrowCpp/Crow/releases/download/v1.1.0/crow_all.h\n\n\nPaso 2. Código del servicio
\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 — comprobación de salud\n CROW_ROUTE(app, "/hello")\n ([](){\n return crow::response(200, "Hello, World!");\n });\n\n // POST /greet — recibe 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: missing 'name'");\n }\n std::string name = body["name"].s();\n crow::json::wvalue result;\n result