بوابة API لخدمات C++: عندما تحدد الأداء كل شيء
\n\nتخيل: لديك عشر خدمات مصغرة بلغة C++، كل منها وحش أداء حقيقي. يرسل العملاء آلاف الطلبات في الثانية، ويبدأ النظام في التباطؤ بسبب... البوابة. ألم مألوف؟ في الغالب، يقوم المطورون بسحب Nginx مع Lua أو Kong الثقيل إلى نظام C++ البيئي، على الرغم من أنهم كانوا يستطيعون كتابة بوابة API خاصة بهم بلغة C++ - سريعة وخفيفة ويمكن التنبؤ بها.
\n\nفي هذه المقالة، سأوضح لك كيفية بناء بوابة API خاصة بك بلغة C++ من الصفر. سنقوم بتحليل الهندسة المعمارية، وكتابة كود عملي بلغة C++ خالصة، ومقارنته بالحلول الشائعة. ستتعرف على متى تكون بوابة API الخاصة بك خيارًا مبررًا، ومتى يكون من الأفضل استخدام حل جاهز.
\n\nلماذا كتابة بوابة API بلغة C++؟
\n\nلنكن صادقين: معظم المشاريع لا تحتاج إلى بوابة مخصصة. Nginx أو Envoy أو Kong تحل 90% من المشاكل. ولكن هناك سيناريوهات لا غنى فيها عن C++:
\n\n- \n
- زمن استجابة أقل من 1 مللي ثانية - الأنظمة المالية، خوادم الألعاب، التداول في الوقت الفعلي \n
- ملايين الطلبات في الثانية - واجهات برمجة التطبيقات عالية التحميل، شبكات توصيل المحتوى، منصات إنترنت الأشياء \n
- متطلبات صارمة للذاكرة - الأنظمة المدمجة، أجهزة الحافة \n
- تكامل وثيق مع كود C++ - استدعاء المكتبات الأصلية دون تكاليف إضافية \n
علاوة على ذلك، تمنحك بوابة API بلغة C++ تحكمًا كاملاً في كل بايت. أنت من يقرر كيفية معالجة الرؤوس، وكيفية التخزين المؤقت، وكيفية موازنة التحميل. لا سحر - فقط أداء يمكن التنبؤ به.
\n\nهندسة بوابة API بلغة C++
\n\nتتكون بوابة API النموذجية بلغة C++ من عدة طبقات:
\n\n- \n
- طبقة النقل - استقبال وإرسال طلبات HTTP (boost::beast، libcurl، مقبس خاص) \n
- الموجه - مطابقة عناوين URL مع خدمات الواجهة الخلفية \n
- البرمجيات الوسيطة - المصادقة، تحديد المعدل، التسجيل، CORS \n
- موازن التحميل - round-robin، least-connections، موزون \n
- ذاكرة التخزين المؤقت - تخزين مؤقت للاستجابات في الذاكرة (LRU، LFU) \n
إليك كيف يبدو ذلك بشكل تخطيطي:
\n\nعميل → [بوابة API بلغة C++] → برمجيات وسيطة → موجه → موازن → الواجهة الخلفية أ\n ↓\n [ذاكرة تخزين مؤقت]\n\nكل طبقة هي وحدة منفصلة. يمكن تجميعها مثل لعبة البناء. هل تريد إضافة التحقق من JWT؟ اكتب برمجية وسيطة. هل تحتاج إلى خوارزمية موازنة جديدة؟ أضف فئة.
\n\nنكتب بوابة API بلغة C++: مثال عملي
\n\nسنستخدم لغة C++20 الحديثة ومكتبة boost::beast لـ HTTP. ستقوم بوابتنا بما يلي:
- \n
- استقبال الطلبات على المنفذ 8080 \n
- التوجيه بناءً على بادئة URL \n
- التحقق من مفتاح API \n
- تحديد 100 طلب في الدقيقة لكل عنوان IP \n
- الموازنة بين واجهتين خلفيتين \n
الخطوة 1: الهيكل الأساسي
\n\n#include <boost/beast/core.hpp>\n#include <boost/beast/http.hpp>\n#include <boost/beast/version.hpp>\n#include <boost/asio/ip/tcp.hpp>\n#include <unordered_map>\n#include <memory>\n#include <string>\n\nnamespace beast = boost::beast;\nnamespace http = beast::http;\nnamespace net = boost::asio;\nusing tcp = net::ip::tcp;\n\n// هيكل لتخزين معلومات الواجهة الخلفية\nstruct Backend {\n std::string host;\n std::string port;\n int weight;\n};\n\n// فئة الموجه\nclass Router {\n std::unordered_map<std::string, std::vector<Backend>> routes_;\n std::unordered_map<std::string, size_t> counters_; // round-robin\n\npublic:\n void add_route(const std::string& prefix, std::vector<Backend> backends) {\n routes_[prefix] = std::move(backends);\n counters_[prefix] = 0;\n }\n\n Backend get_backend(const std::string& path) {\n