Microservicios en C++: arquitectura y práctica de la A a la Z
La arquitectura de microservicios se ha convertido desde hace tiempo en el estándar para construir sistemas escalables y tolerantes a fallos. Sin embargo, la mayoría de los ejemplos en internet están escritos en Java, Go o Python. ¿Y qué hacer si necesitas el máximo rendimiento y control sobre los recursos? La respuesta son los microservicios en C++. En este artículo analizaremos la arquitectura, las tecnologías clave y escribiremos un ejemplo real de un microservicio en C++.
¿Por qué C++ para microservicios?
C++ se asocia tradicionalmente con la programación de sistemas, juegos y desarrollo embebido. Sin embargo, sus ventajas para los microservicios son evidentes:
- Máximo rendimiento — gastos generales mínimos de memoria y procesador.
- Control preciso de recursos — gestión manual de memoria (o punteros inteligentes modernos).
- Baja latencia — ideal para high-frequency trading, servidores de juegos e IoT.
- Amplia selección de bibliotecas — desde Boost hasta gRPC y Poco.
También hay desventajas: complejidad de desarrollo, compilación lenta y falta de prototipos "rápidos". Pero con un enfoque adecuado, C++ se convierte en una herramienta poderosa para microservicios.
Arquitectura de un microservicio en C++
Un microservicio típico en C++ consta de las siguientes capas:
- Transport layer — HTTP/REST (cpprestsdk), gRPC, WebSocket o TCP/UDP.
- Business logic — C++17/20 puro, procesamiento de datos, algoritmos.
- Data layer — trabajo con BD (PostgreSQL a través de libpqxx, Redis a través de hiredis).
- Communication — interacción entre servicios (gRPC, RabbitMQ, Kafka).
Es importante separar estas capas para que cada microservicio sea independiente y fácil de probar.
Ejemplo práctico: Microservicio REST API en C++
Escribamos un microservicio simple para la gestión de tareas (Task Manager) utilizando la biblioteca cpprestsdk (Casablanca).
1. Instalación de dependencias
Para Ubuntu/Debian:
sudo apt-get install libcpprest-dev libboost-all-dev libssl-dev2. Código del microservicio
Creemos el archivo task_service.cpp:
#include <cpprest/http_listener.h>#include <cpprest/json.h>#include <iostream>#include <map>#include <mutex>
using namespace web;using namespace web::http;using namespace web::http::experimental::listener;
class TaskService {private: std::map<int, std::string> tasks; std::mutex mtx; int next_id = 1;
void handle_get(http_request request) { json::value response; std::lock_guard<std::mutex> lock(mtx); for (const auto& [id, desc] : tasks) { response[std::to_string(id)] = json::value::string(desc); } request.reply(status_codes::OK, response); }
void handle_post(http_request request) { request.extract_json().then([this, &request](json::value body) { std::lock_guard<std::mutex> lock(mtx); int id = next_id++; tasks[id] = body.at("description").as_string(); json::value response; response["id"] = id; request.reply(status_codes::Created, response); }).wait(); }
public: TaskService() { uri_builder uri("http://localhost:8080"); auto addr = uri.to_uri().to_string(); http_listener listener(addr);
listener.support(methods::GET, std::bind(&TaskService::handle_get, this, std::placeholders::_1)); listener.support(methods::POST, std::bind(&TaskService::handle_post, this, std::placeholders::_1));
listener.open().then([&addr]() { std::c