Einführung in Microservices mit C++
Die Microservice-Architektur (MSA) ist einer der dominierenden Ansätze zur Entwicklung moderner verteilter Systeme. Obwohl C++ seltener mit Microservices assoziiert wird als Go, Java oder Python, bleibt es unverzichtbar für Szenarien, in denen Leistung, niedrige Latenz und effiziente Speichernutzung kritisch sind. In diesem Artikel werden wir erläutern, wie man Microservices mit C++ erstellt, welche Frameworks und Bibliotheken verwendet werden, und praktische Codebeispiele betrachten.
Warum C++ für Microservices?
Die Hauptvorteile von C++ bei der Entwicklung von Microservices:
- Maximale Leistung — C++ ermöglicht minimale Antwortzeiten (latency) und hohen Durchsatz (throughput).
- Kontrolle über Ressourcen — manuelle Speicherverwaltung und Optimierung auf Hardware-Ebene.
- Ausgereifte Bibliotheken — Boost, Poco, cpp-httplib, gRPC, Crow.
- Integration mit Legacy-Systemen — C++ wird oft in Kernen hochbelasteter Systeme verwendet (Finanzen, Telekommunikation, Spiele).
Microservice-Architektur mit C++
Hauptkomponenten
Ein typischer Microservice mit C++ umfasst:
- HTTP/REST-Server — zum Empfangen von Anfragen (z. B. mit
cpp-httpliboderCrow). - Geschäftslogik — Module zur Datenverarbeitung.
- Client für serviceübergreifende Kommunikation — gRPC oder HTTP-Client.
- Speicheranbindung — Verbindung zu PostgreSQL, Redis oder Kafka über Bibliotheken (libpqxx, redis-plus-plus, librdkafka).
Kommunikation zwischen Services
Zwei Hauptprotokolle:
- gRPC — binäres Protokoll auf Basis von Protobuf, bietet strenge Typisierung und hohe Geschwindigkeit.
- REST (JSON) — geeignet für externe APIs, aber langsamer aufgrund der Serialisierung.
Praxis: Erstellung eines Microservices mit C++
1. Einfache REST-API mit cpp-httplib
Betrachten wir einen minimalen Service, der eine GET-Anfrage empfängt und JSON zurückgibt. Die Bibliothek cpp-httplib ist header-only und leicht einzubinden.
// main.cpp#include <httplib.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { httplib::Server svr;
// GET /hello — gibt JSON zurück 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 — empfängt JSON und verarbeitet es 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;}Build (erfordert installiertes nlohmann/json):
g++ -std=c++17 main.cpp -o microservice -lpthread./microservice2. Microservice mit gRPC
gRPC erfordert die Definition des Services in einer .proto-Datei. Beispiel:
// calculator.protosyntax = "proto3";
service Calculator { rpc Add (AddRequest) returns (AddResponse);}
message AddRequest { int32 a = 1; int32 b = 2;}