الخدمات المصغرة بلغة C++: الهندسة والممارسة للأنظمة عالية التحميل

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

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

ابدأ الدورة

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



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



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

  • أقصى أداء (كود يتم تجميعه محليًا)
  • استهلاك ضئيل للذاكرة
  • تحكم كامل في الموارد
  • عدم وجود جامع للقمامة (زمن وصول قابل للتنبؤ)


سنناقش البنية، وتنفيذ REST API، و gRPC، والعمل مع قوائم الانتظار، والحاويات من خلال أمثلة عملية.



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



المبادئ الأساسية

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

  • مستقلة — كل خدمة تعمل بشكل مستقل
  • ضعيفة الاقتران — الحد الأدنى من التبعيات بين الخدمات
  • موجهة نحو وظائف الأعمال — خدمة واحدة تحل مهمة واحدة
  • مقاومة للأعطال — تدهور تدريجي (graceful degradation)


هيكل المشروع النموذجي

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/│   └── (الملفات الرأسية العامة)├── tests/│   └── test_order_service.cpp└── Dockerfile


التنفيذ العملي: خدمة REST API مصغرة



اختيار مكتبة HTTP

بالنسبة لـ C++، أفضل الخيارات هي cpp-httplib (خفيفة الوزن، header-only) و Drogon (إطار عمل متكامل). سننظر في مثال باستخدام cpp-httplib.



مثال: خدمة إدارة الطلبات

// 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 — إنشاء طلب 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} — الحصول على طلب 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

المدونات

توصيات الكتب