الميكروسيرفيسات بلغة C++: الهندسة والممارسة من الألف إلى الياء

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

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

ابدأ الدورة

ميكروسيرفيسات بلغة C++: الهندسة والتطبيق من الألف إلى الياء



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



لماذا C++ للميكروسيرفيسات؟

ترتبط لغة C++ تقليديًا ببرمجة الأنظمة والألعاب والتطوير المضمن. ومع ذلك، فإن مزاياها للميكروسيرفيسات واضحة:

  • أقصى أداء — الحد الأدنى من التكاليف الإضافية على الذاكرة والمعالج.
  • تحكم دقيق في الموارد — إدارة يدوية للذاكرة (أو المؤشرات الذكية الحديثة).
  • زمن استجابة منخفض — مثالي للتداول عالي التردد وخوادم الألعاب وإنترنت الأشياء.
  • مجموعة غنية من المكتبات — من Boost إلى gRPC و Poco.

هناك أيضًا عيوب: تعقيد التطوير، وبطء التجميع، وغياب النماذج الأولية "السريعة". ولكن مع النهج الصحيح، تصبح C++ أداة قوية للميكروسيرفيسات.



هندسة الميكروسيرفيس بلغة C++

يتكون الميكروسيرفيس النموذجي بلغة C++ من الطبقات التالية:

  • طبقة النقل — HTTP/REST (cpprestsdk)، gRPC، WebSocket أو TCP/UDP.
  • منطق الأعمال — C++17/20 نقي، معالجة البيانات، الخوارزميات.
  • طبقة البيانات — العمل مع قواعد البيانات (PostgreSQL عبر libpqxx، Redis عبر hiredis).
  • الاتصال — التفاعل بين الخدمات (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::c

المدونات

توصيات الكتب