فهم نمط بوابة API في الخدمات الصغيرة: دليل بسيط
يؤدي الانتقال من تطبيق واحد متجانس إلى بنية الخدمات الصغيرة إلى حل العديد من المشكلات. فهو يسمح للفرق بالعمل بشكل مستقل ونشر الخدمات بشكل منفصل وتوسيع نطاق أجزاء النظام حسب الحاجة. ومع ذلك، فإنه يطرح أيضًا تحديًا جديدًا: كيف يتفاعل العملاء مع كل هذه الخدمات المستقلة؟
إذا كان لديك عشرة أو خمسين أو مئات من الخدمات الصغيرة الصغيرة، فهل يجب أن يتصل تطبيق الهاتف المحمول أو صفحة الويب بكل واحدة منها مباشرة؟
هذا هو المكان الذي يأتي فيه نمط بوابة واجهة برمجة التطبيقات. في هذا الدليل، سنوضح ماهية بوابة واجهة برمجة التطبيقات، ولماذا تحتاج إليها، وكيف تعمل على تبسيط نظام الخدمات الصغيرة الخاص بك باستخدام كلمات بسيطة وتشبيهات واقعية.
القياس على العالم الحقيقي: موظف استقبال الفندق
تخيل أنك تقيم في فندق منتجعي كبير وفاخر. يضم المنتجع العديد من الأقسام المختلفة:
- التدبير المنزلي (للشراشف النظيفة)
- خدمة الغرف (للطعام)
- الكونسيرج (لحجز الجولات السياحية)
- الفواتير (لدفع الفاتورة)
إذا كنت تريد منشفة نظيفة، فلا تمشي عبر المنتجع محاولًا العثور على مبنى التدبير المنزلي. إذا كنت تريد العشاء، فلا تطرق باب المطبخ. وبدلاً من ذلك، يمكنك الاتصال بـ موظف الاستقبال في مكتب الاستقبال.
يستمع موظف الاستقبال لطلبك، ويحدد القسم الذي يمكنه حله، ويوصلك أو يتولى الأمر نيابة عنك.
في هذا السيناريو:
- أنت أنت العميل (تطبيق الهاتف المحمول أو المتصفح).
- موظف الاستقبال هو بوابة واجهة برمجة التطبيقات.
- الأقسام (التدبير المنزلي، خدمة الغرف، الفواتير) هي الخدمات الصغيرة.
المشكلة: الاتصال المباشر بين العميل والخدمة
قبل أن ننظر إلى كيفية عمل البوابة، دعونا نرى ما يحدث إذا لم نستخدم واحدة.
لنفترض أن تطبيق التجارة الإلكترونية الخاص بك يحتوي على ثلاث خدمات صغيرة منفصلة:
- خدمة المستخدم (إدارة الملفات الشخصية)
- خدمة المنتج (إدارة الكتالوج)
- خدمة الطلب (إدارة عملية الدفع)
بدون بوابة API، يتعين على تطبيق العميل إرسال طلبات منفصلة مباشرةً إلى العنوان الفردي لكل خدمة (IP أو URL):
يخلق أسلوب الاتصال المباشر هذا العديد من المشكلات الرئيسية:
- نقاط نهاية كثيرة جدًا: يجب أن يتذكر تطبيق العميل ثلاثة عناوين URL منفصلة. إذا قمت بتقسيم خدمة أو تغيير عنوانها، فيجب عليك تحديث تطبيق العميل.
- كابوس الأمان: يجب على كل خدمة صغيرة تنفيذ المصادقة بشكل منفصل (التحقق من الرموز المميزة لتسجيل الدخول)، وشهادات SSL، وقواعد جدار الحماية.
- حمل الشبكة: قد يحتاج العميل إلى تقديم ثلاثة طلبات شبكة منفصلة عبر شبكات الهاتف المحمول البطيئة فقط لتحميل صفحة واحدة (على سبيل المثال، جلب الملف الشخصي، وجلب تفاصيل المنتج، وجلب سجل الطلبات).
- اختلافات البروتوكول: قد يفضل تطبيق العميل الخاص بك استخدام بروتوكولات الويب القياسية مثل HTTP/JSON، ولكن خدماتك الداخلية قد تتواصل بشكل أسرع باستخدام بروتوكولات متخصصة مثل gRPC أو AMQP.
الحل: نمط بوابة API
بوابة واجهة برمجة التطبيقات هي خادم مساعد يقع بين تطبيقات العميل والخدمات الصغيرة الداخلية. وهو بمثابة نقطة دخول واحدة لجميع الطلبات الواردة.
بدلاً من الاتصال بثلاث خدمات مختلفة، يقوم العميل بإجراء اتصال واحد ببوابة API. تقوم البوابة بعد ذلك بإعادة توجيه الطلب إلى الخدمة الداخلية الصحيحة، وجمع النتائج، وإرسالها مرة أخرى إلى العميل.
المسؤوليات الرئيسية لبوابة API
تقوم بوابة API بأكثر من مجرد حركة المرور المباشرة. إنه يعتني بـ “المخاوف الشاملة” - وهي المهام التي قد يتعين على كل خدمة صغيرة كتابة تعليمات برمجية لها:
- التوجيه: تأخذ البوابة عنوان URL الوارد (مثل
/api/v1/orders) وتقوم بتعيينه إلى عنوان الخدمة الداخلي الصحيح. - المصادقة والترخيص: تتحقق البوابة من صحة رموز الأمان (مثل JWTs) عند باب الدخول. إذا كان الطلب غير صالح، فسيتم رفضه على الفور، مما يوفر على خدماتك الصغيرة من إضاعة دورات وحدة المعالجة المركزية على الطلبات غير المصادق عليها.
- تحديد المعدل: يمنع برامج الروبوت الضارة أو عملاء عربات التي تجرها الدواب من إرسال بريد عشوائي إلى نظامك عن طريق تحديد عدد الطلبات التي يمكن للمستخدم إجراؤها في الدقيقة.
- موازنة التحميل: يمكن للبوابة توزيع حركة المرور الواردة بالتساوي عبر مثيلات متعددة للخدمة الصغيرة لمنع أي خادم واحد من التحميل الزائد.
- ترجمة البروتوكول: يمكنها ترجمة طلبات JSON التي يواجهها المستخدم إلى رسائل gRPC داخلية عالية الأداء، مما يسمح للخدمات بالتحدث مع بعضها البعض باللغات المفضلة لديهم.
تنفيذ بسيط: مثال للتعليمات البرمجية
لمعرفة مدى سهولة التوجيه، دعونا نلقي نظرة على طريقتين شائعتين لإعداد بوابة API.
1. التوجيه التعريفي (بوابة Spring Cloud YAML)
في أنظمة Java الخاصة بالمؤسسات، غالبًا ما تقوم بتكوين التوجيه باستخدام ملف تكوين بسيط. تقوم البوابة تلقائيًا بإعادة توجيه الطلبات بناءً على هذه القواعد:
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: http://internal-user-service:8081
predicates:
- Path=/api/users/**
- id: product_service_route
uri: http://internal-product-service:8082
predicates:
- Path=/api/products/**
2. التوجيه البرمجي (نموذج بوابة Node.js)
إذا كنت تريد إنشاء بوابة API خفيفة الوزن في Javascript باستخدام Express، فستبدو كما يلي:
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
const PORT = 3000;
// 1. Simple Security/Authentication Check at the door
const authenticate = (req, res, next) => {
const token = req.headers['authorization'];
if (token === 'secret-handshake-token') {
next(); // Token is valid, proceed
} else {
res.status(401).json({ error: 'Unauthorized Access!' });
}
};
// Apply auth check to all incoming gateway requests
app.use(authenticate);
// 2. Route requests to correct internal microservices
app.use('/api/users', createProxyMiddleware({ target: 'http://localhost:8081', changeOrigin: true }));
app.use('/api/products', createProxyMiddleware({ target: 'http://localhost:8082', changeOrigin: true }));
app.use('/api/orders', createProxyMiddleware({ target: 'http://localhost:8083', changeOrigin: true }));
app.listen(PORT, () => {
console.log(`API Gateway running smoothly on port ${PORT}`);
});
إيجابيات وسلبيات نمط بوابة API
مثل أي قرار معماري، فإن استخدام بوابة API له بعض التنازلات:
| ميزة (برو) | العيب (كون) |
|---|---|
| واجهة عميل بسيطة: يحتاج العملاء فقط إلى معرفة اسم مجال واحد. | نقطة فشل واحدة: إذا تعطلت البوابة، يصبح التطبيق بأكمله غير قابل للوصول. |
| الأمان المركزي: تنفيذ عمليات التحقق من تسجيل الدخول وSSL وCORS في مكان واحد. | زمن الوصول الإضافي: تستغرق الطلبات وقتًا أطول قليلاً لأنها يجب أن تمر عبر خطوة إضافية في الشبكة. |
| تقليل تكرار الكود: تجنب إعادة كتابة كود المصادقة والحد من المعدل في كل خدمة. | نفقات الصيانة العامة: يجب تحديث البوابة عند إضافة خدمات أو إزالتها أو تقسيمها. |
خاتمة
يعد نمط بوابة API حجر الزاوية في بنية الخدمات الصغيرة الحديثة. ومن خلال العمل كنقطة دخول ذكية واحدة، فإنه يحمي تطبيقات العميل من تعقيد إعدادات الخدمة الداخلية. فهو يبسط التعليمات البرمجية من جانب العميل، ويمركز الأمان، ويتعامل مع إدارة حركة المرور بكفاءة.
على الرغم من أنه يقدم قفزة بسيطة في الشبكة ويحتاج إلى إعداد مع توفر عالي في الإنتاج، فإن فوائد قواعد التعليمات البرمجية الأكثر نظافة والأكثر أمانًا وقابلية للإدارة تجعله نمطًا موصى به للغاية لأي نظام موزع متنامي.
استكشف المزيد من الرؤى المتعلقة بتطوير البرامج وهندسة الواجهة الخلفية على مدونة Gaznix →