Einführung: Warum C++ für Microservices?
Microservice-Architektur hat die Entwicklungswelt fest im Griff, wird aber traditionell mit Sprachen wie Go, Java oder Python assoziiert. C++ bleibt jedoch unverzichtbar, wo Leistung, niedrige Latenz und effiziente Speichernutzung kritisch sind. In diesem Artikel analysieren wir, wie man Microservices in C++ erstellt, welche Bibliotheken verwendet werden und wie die Infrastruktur organisiert wird.
Die wichtigsten Vorteile von C++ in Microservices:
- Maximale Leistung (nativ kompilierter Code)
- Minimaler Speicherverbrauch
- Vollständige Kontrolle über Ressourcen
- Kein Garbage Collector (vorhersagbare Latenzen)
Wir betrachten die Architektur, Implementierung von REST API, gRPC, Arbeit mit Warteschlangen und Containerisierung anhand praktischer Beispiele.
Microservice-Architektur in C++
Grundlegende Prinzipien
Ein Microservice in C++ sollte sein:
- Autonom — jeder Dienst arbeitet unabhängig
- Lose gekoppelt — minimale Abhängigkeiten zwischen Diensten
- Geschäftsfunktionsorientiert — ein Dienst löst eine Aufgabe
- Ausfallsicher — graceful degradation
Typische Projektstruktur
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/│ └── (öffentliche Header)├── tests/│ └── test_order_service.cpp└── DockerfilePraktische Implementierung: REST API Microservice
Auswahl der HTTP-Bibliothek
Für C++ sind die besten Optionen cpp-httplib (leichtgewichtig, header-only) und Drogon (voll funktionsfähiges Framework). Betrachten wir ein Beispiel mit cpp-httplib.
Beispiel: Bestellverwaltungsdienst
// 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 — Bestellung erstellen 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} — Bestellung abrufen 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