Microservicios en C++: arquitectura y práctica para sistemas de alta carga

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué C++ para microservicios?



La arquitectura de microservicios se ha consolidado firmemente en el mundo del desarrollo, pero tradicionalmente se asocia con lenguajes como Go, Java o Python. Sin embargo, C++ sigue siendo indispensable 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é bibliotecas utilizar y cómo organizar la infraestructura.



Principales ventajas de C++ en microservicios:

  • Máximo rendimiento (código compilado nativamente)
  • Consumo mínimo de memoria
  • Control total sobre los recursos
  • Sin garbage collector (latencias predecibles)


Analizaremos la arquitectura, implementación de REST API, gRPC, trabajo con colas y contenerización con ejemplos prácticos.



Arquitectura de microservicio en C++



Principios básicos

Un microservicio en C++ debe ser:

  • Autónomo — cada servicio funciona de forma independiente
  • Débilmente acoplado — dependencias mínimas entre servicios
  • Orientado a funciones de negocio — un servicio resuelve una tarea
  • Tolerante a fallos — graceful degradation


Estructura típica del proyecto

my_microservice/├── CMakeLists.txt├── src/│   ├── main.cpp│   ├── server/│   │   ├── http_server.cpp│   │   └── http_server.h│   ├── service/│   │   ├── order_service.cpp│   │   └── order_service.h│   ├── repository/│   │   ├── order_repository.cpp│   │   └── order_repository.h│   └── config/│       ├── config.cpp│       └── config.h├── include/│   └── (encabezados públicos)├── tests/│   └── test_order_service.cpp└── Dockerfile


Implementación práctica: microservicio REST API



Selección de biblioteca HTTP

Para C++ las mejores opciones son cpp-httplib (ligera, header-only) y Drogon (framework completo). Veamos un ejemplo con cpp-httplib.



Ejemplo: servicio de gestión de pedidos

// main.cpp#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>#include <memory>#include "order_service.h"

using json = nlohmann::json;

int main() { httplib::Server svr; auto orderService = std::make_shared<OrderService>();

// POST /orders — creación de pedido svr.Post("/orders", [orderService](const httplib::Request& req, httplib::Response& res) { try { auto data = json::parse(req.body); auto order = orderService->createOrder(data); res.set_content(order.dump(), "application/json"); res.status = 201; } catch (const std::exception& e) { res.set_content(json{{"error", e.what()}}.dump(), "application/json"); res.status = 400; } });

// GET /orders/{id} — obtención de pedido svr.Get(R"(/orders/(\\d+))", [orderService](const httplib::Request& req, httplib::Response& res) { int orderId = std::stoi(req.matches[1]); auto order = orderService->getOrder(orderId); if (order) { res.set_content(order->dump(), "application/json"); } else { res.status = 404; res.set_content(json{{"error", "Order not found"}}.dump(), "application/json"); } });

std::cout << "Server started on port 8080" << std::endl; svr.listen("0.0.0.0", 8080); return 0;}


// order_service.cpp#include "order_service.h"#include <stdexcept>

using json = nlohmann::json;

json OrderService::createOrder(const json& data) { if (!data.contains("product_id") || !data.contains("quantity")) { throw std::invalid_argument("Missing required fields"); }

Order or

Blogs

Book Recommendations