Микросервисы на C++: архитектура и практика от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Микросервисы на C++: архитектура и практика от А до Я

Микросервисная архитектура давно стала стандартом для построения масштабируемых и отказоустойчивых систем. Однако большинство примеров в интернете написаны на Java, Go или Python. А что делать, если вам нужна максимальная производительность и контроль над ресурсами? Ответ — микросервисы на C++. В этой статье мы разберем архитектуру, ключевые технологии и напишем реальный пример микросервиса на C++.

Почему C++ для микросервисов?

C++ традиционно ассоциируется с системным программированием, играми и embedded-разработкой. Однако его преимущества для микросервисов очевидны:

  • Максимальная производительность — минимальные накладные расходы на память и процессор.
  • Тонкий контроль ресурсов — ручное управление памятью (или современные умные указатели).
  • Низкая задержка — идеально для high-frequency trading, гейм-серверов и IoT.
  • Богатый выбор библиотек — от Boost до gRPC и Poco.

Минусы тоже есть: сложность разработки, медленная компиляция и отсутствие "быстрых" прототипов. Но при грамотном подходе C++ становится мощным инструментом для микросервисов.

Архитектура микросервиса на C++

Типичный микросервис на C++ состоит из следующих слоев:

  • Transport layer — HTTP/REST (cpprestsdk), gRPC, WebSocket или TCP/UDP.
  • Business logic — чистый C++17/20, обработка данных, алгоритмы.
  • Data layer — работа с БД (PostgreSQL через libpqxx, Redis через hiredis).
  • Communication — межсервисное взаимодействие (gRPC, RabbitMQ, Kafka).

Важно разделить эти слои, чтобы каждый микросервис был независим и легко тестировался.

Практический пример: REST API микросервис на C++

Напишем простой микросервис для управления задачами (Task Manager) с использованием библиотеки cpprestsdk (Casablanca).

1. Установка зависимостей

Для Ubuntu/Debian:

sudo apt-get install libcpprest-dev libboost-all-dev libssl-dev

2. Код микросервиса

Создадим файл 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::cout << "Сервис запущен на " << addr << std::endl;
        }).wait();
    }
};

int main() {
    TaskService service;
    std::string line;
    std::getline(std::cin, line);
    return 0;
}

3. Сборка и запуск

g++ -std=c++17 task_service.cpp -lcpprest -lboost_system -lssl -lcrypto -lpthread -o task_service
./task_service

Теперь сервис слушает порт 8080. Проверим через curl:

# Добавить задачу
curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"description":"Изучить C++ микросервисы"}'

# Получить все задачи
curl http://localhost:8080

Межсервисное взаимодействие: gRPC на C++

Для продакшн-систем лучше использовать gRPC вместо REST. Он быстрее, строже типизирован и поддерживает потоковую передачу.

Пример proto-файла:

syntax = "proto3";

service TaskService {
    rpc AddTask (TaskRequest) returns (TaskResponse);
    rpc ListTasks (Empty) returns (TaskList);
}

message TaskRequest {
    string description = 1;
}

message TaskResponse {
    int32 id = 1;
}

message TaskList {
    map<int32, string> tasks = 1;
}

message Empty {}

Генерация C++ кода из proto-файла выполняется через protoc с плагином grpc.

Заключение

Микросервисы на C++ — это не экзотика, а реальный инструмент для высоконагруженных систем. Мы рассмотрели:

  • Плюсы и минусы C++ в микросервисной архитектуре.
  • Базовую архитектуру и слои.
  • Рабочий пример REST API микросервиса.
  • Альтернативу в виде gRPC для продакшна.

Начните с малого: напишите один микросервис на C++, оберните его в Docker и подключите к базе данных. Со временем вы сможете строить целые распределенные системы, работающие на пределе производительности. А PythonLib поможет вам с теорией и практикой!

Блоги

Рекомендаций по книгам