الميكروسيرفيسات بلغة C++: الهندسة المعمارية، الممارسة وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في الخدمات المصغرة باستخدام C++



تُعد بنية الخدمات المصغرة (MSA) أحد الأساليب السائدة لبناء الأنظمة الموزعة الحديثة. على الرغم من أن لغة C++ ترتبط بالخدمات المصغرة بشكل أقل من Go أو Java أو Python، إلا أنها تبقى لا غنى عنها في السيناريوهات التي تكون فيها الأداء العالي، وزمن الاستجابة المنخفض، والاستخدام الفعال للذاكرة أمورًا حاسمة. في هذه المقالة، سنشرح كيفية بناء الخدمات المصغرة باستخدام C++، وما هي الأطر والمكتبات التي يجب استخدامها، وسنستعرض أمثلة عملية على الكود.



لماذا C++ للخدمات المصغرة؟

المزايا الرئيسية لاستخدام C++ في تطوير الخدمات المصغرة:

  • أقصى أداء — تتيح C++ تحقيق أقل زمن استجابة (latency) وأعلى إنتاجية (throughput).
  • التحكم في الموارد — إدارة يدوية للذاكرة وتحسين على مستوى العتاد.
  • مكتبات ناضجة — Boost, Poco, cpp-httplib, gRPC, Crow.
  • التكامل مع الأنظمة القديمة (legacy) — غالبًا ما تُستخدم C++ في نوى الأنظمة عالية التحميل (المالية، الاتصالات، الألعاب).


بنية الخدمة المصغرة باستخدام C++



المكونات الأساسية

تتضمن الخدمة المصغرة النموذجية باستخدام C++:

  • خادم HTTP/REST — لاستقبال الطلبات (على سبيل المثال، باستخدام cpp-httplib أو Crow).
  • منطق الأعمال — وحدات معالجة البيانات.
  • عميل للتواصل بين الخدمات — gRPC أو عميل HTTP.
  • التعامل مع التخزين — الاتصال بـ PostgreSQL أو Redis أو Kafka عبر المكتبات (libpqxx, redis-plus-plus, librdkafka).


التواصل بين الخدمات

بروتوكولان رئيسيان:

  • gRPC — بروتوكول ثنائي يعتمد على Protobuf، يوفر كتابة صارمة وسرعة عالية.
  • REST (JSON) — مناسب لواجهات API الخارجية، لكنه أبطأ بسبب التسلسل (serialization).


تطبيق عملي: إنشاء خدمة مصغرة باستخدام C++



1. واجهة REST API بسيطة باستخدام cpp-httplib

لننظر إلى خدمة بسيطة تستقبل طلب GET وتعيد JSON. مكتبة cpp-httplib هي header-only، ويسهل تضمينها.



// main.cpp#include <httplib.h>#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() { httplib::Server svr;

// GET /hello — يعيد JSON 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 — يستقبل JSON ويعالجه 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;}


التجميع (يتطلب تثبيت nlohmann/json):

g++ -std=c++17 main.cpp -o microservice -lpthread./microservice


2. خدمة مصغرة باستخدام gRPC

يتطلب gRPC تعريف الخدمة في ملف .proto. مثال:



// calculator.protosyntax = "proto3";

service Calculator { rpc Add (AddRequest) returns (AddResponse);}

message AddRequest { int32 a = 1; int32 b = 2;}

المدونات

توصيات الكتب