Microsserviços em C++: arquitetura e prática do A ao Z
A arquitetura de microsserviços há muito se tornou o padrão para construir sistemas escaláveis e tolerantes a falhas. No entanto, a maioria dos exemplos na internet é escrita em Java, Go ou Python. E o que fazer se você precisar de desempenho máximo e controle sobre os recursos? A resposta — microsserviços em C++. Neste artigo, analisaremos a arquitetura, as principais tecnologias e escreveremos um exemplo real de microsserviço em C++.
Por que C++ para microsserviços?
C++ é tradicionalmente associado à programação de sistemas, jogos e desenvolvimento embarcado. No entanto, suas vantagens para microsserviços são óbvias:
- Desempenho máximo — sobrecarga mínima de memória e processador.
- Controle preciso de recursos — gerenciamento manual de memória (ou ponteiros inteligentes modernos).
- Baixa latência — ideal para high-frequency trading, servidores de jogos e IoT.
- Ampla variedade de bibliotecas — desde Boost até gRPC e Poco.
Também existem desvantagens: complexidade de desenvolvimento, compilação lenta e ausência de protótipos "rápidos". Mas com uma abordagem competente, C++ se torna uma ferramenta poderosa para microsserviços.
Arquitetura de um microsserviço em C++
Um microsserviço típico em C++ consiste nas seguintes camadas:
- Transport layer — HTTP/REST (cpprestsdk), gRPC, WebSocket ou TCP/UDP.
- Business logic — C++17/20 puro, processamento de dados, algoritmos.
- Data layer — trabalho com banco de dados (PostgreSQL via libpqxx, Redis via hiredis).
- Communication — comunicação entre serviços (gRPC, RabbitMQ, Kafka).
É importante separar essas camadas para que cada microsserviço seja independente e facilmente testável.
Exemplo prático: microsserviço REST API em C++
Vamos escrever um microsserviço simples para gerenciamento de tarefas (Task Manager) usando a biblioteca cpprestsdk (Casablanca).
1. Instalação das dependências
Para Ubuntu/Debian:
sudo apt-get install libcpprest-dev libboost-all-dev libssl-dev2. Código do microsserviço
Criaremos o arquivo 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