Introducción a los microservicios en C++
La arquitectura de microservicios (MSA) es uno de los enfoques dominantes para construir sistemas distribuidos modernos. Aunque C++ se asocia menos frecuentemente con microservicios que Go, Java o Python, sigue siendo indispensable para escenarios donde el rendimiento, la baja latencia y el uso eficiente de la memoria son críticos. En este artículo, analizaremos cómo construir microservicios en C++, qué frameworks y bibliotecas utilizar, y veremos ejemplos prácticos de código.
¿Por qué C++ para microservicios?
Las principales ventajas de C++ en el desarrollo de microservicios son:
- Máximo rendimiento — C++ permite lograr un tiempo de respuesta mínimo (latency) y un alto rendimiento (throughput).
- Control sobre los recursos — gestión manual de memoria y optimización a nivel de hardware.
- Bibliotecas maduras — Boost, Poco, cpp-httplib, gRPC, Crow.
- Integración con sistemas legacy — C++ se utiliza a menudo en los núcleos de sistemas de alta carga (finanzas, telecomunicaciones, juegos).
Arquitectura de un microservicio en C++
Componentes principales
Un microservicio típico en C++ incluye:
- Servidor HTTP/REST — para recibir solicitudes (por ejemplo, usando
cpp-httpliboCrow). - Lógica de negocio — módulos de procesamiento de datos.
- Cliente para comunicación entre servicios — gRPC o cliente HTTP.
- Trabajo con almacenamiento — conexión a PostgreSQL, Redis o Kafka mediante bibliotecas (libpqxx, redis-plus-plus, librdkafka).
Comunicación entre servicios
Dos protocolos principales:
- gRPC — protocolo binario basado en Protobuf, proporciona tipado estricto y alta velocidad.
- REST (JSON) — conveniente para APIs externas, pero más lento debido a la serialización.
Práctica: creación de un microservicio en C++
1. API REST simple con cpp-httplib
Veamos un servicio mínimo que recibe una solicitud GET y devuelve JSON. La biblioteca cpp-httplib es header-only, fácil de incluir.
// main.cpp#include <httplib.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { httplib::Server svr;
// GET /hello — devuelve JSON svr.Get("/hello", [](const httplib::Request& req, httplib::Response& res) { json response; response["message"] = "Hello from C++ microservice!"; response["status"] = "ok"; res.set_content(response.dump(), "application/json"); });
// POST /data — recibe JSON y lo procesa svr.Post("/data", [](const httplib::Request& req, httplib::Response& res) { try { auto input = json::parse(req.body); int value = input["value"]; json result; result["squared"] = value * value; res.set_content(result.dump(), "application/json"); } catch (const std::exception& e) { res.status = 400; res.set_content("{\\"error\\":\\"Invalid JSON\\"}", "application/json"); } });
std::cout << "Server started on port 8080"; svr.listen("0.0.0.0", 8080); return 0;}Compilación (requiere nlohmann/json instalado):
g++ -std=c++17 main.cpp -o microservice -lpthread./microservice2. Microservicio con gRPC
gRPC requiere definir el servicio en un archivo .proto. Ejemplo:
// calculator.protosyntax = "proto3";
service Calculator { rpc Add (AddRequest) returns (AddResponse);}
message AddRequest { int32 a = 1; int32 b = 2;}