بوابة API للخدمات المصغرة بلغة JavaScript: دليل شامل

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

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

ابدأ الدورة

لماذا يحتاج مشروعك إلى بوابة API بلغة JavaScript؟

\n\n

تخيل أن الخلفية (backend) الخاصة بك هي مركز تسوق ضخم. بداخله عشرات المتاجر (الخدمات المصغرة): واحد يبيع الكتب، وآخر الملابس، وثالث الإلكترونيات. كل متجر له مدخله الخاص، وقواعده الخاصة، ولغته الخاصة. والآن تخيل أن الزائر (تطبيق العميل) يجب أن يزور كل هذه المداخل لشراء قميص واحد. فوضى، أليس كذلك؟

\n\n

في عالم تطوير الويب، تحل بوابة API هذه المشكلة - وهي نقطة دخول موحدة لجميع الخدمات المصغرة. إنها مثل مدير مركز التسوق: توجه الطلبات، وتفحص التذاكر (الرموز المميزة)، وتجمع البيانات من المتاجر المختلفة، وتعطي العميل الرد الجاهز. واليوم سنشرح كيفية كتابة مثل هذه البوابة بلغة JavaScript الخالصة باستخدام Node.js.

\n\n

ستكون هذه المقالة مفيدة لكل من المبتدئين الذين يتعرفون فقط على بنية الخدمات المصغرة، والمطورين ذوي الخبرة الذين يريدون رؤية أمثلة كود عملية. هيا بنا!

\n\n

ما هي بوابة API ولماذا نحتاجها؟

\n\n

بوابة API هي مكون خادم يعمل كطبقة وسيطة بين العميل والخدمات الداخلية. تتولى المهام التالية:

\n
    \n
  • التوجيه - توجيه الطلبات إلى الخدمة المصغرة المناسبة.
  • \n
  • المصادقة والتفويض - التحقق مما إذا كان المستخدم لديه صلاحية الوصول.
  • \n
  • تجميع البيانات - جمع الردود من عدة خدمات في رد واحد.
  • \n
  • تحديد عدد الطلبات - حماية الخلفية من الأحمال الزائدة.
  • \n
  • تحويل البروتوكولات - على سبيل المثال، تحويل REST إلى GraphQL.
  • \n
\n\n

بالنسبة لخدمات JavaScript (خاصة على Node.js)، فإن بوابة API هي الخيار الطبيعي. يمكن كتابتها بسهولة باستخدام Express أو Koa أو Fastify، والأهم من ذلك، أنها تسمح بالحفاظ على نمط كود موحد في جميع أنحاء المشروع.

\n\n

تصميم هيكل بوابة API على Node.js

\n\n

قبل كتابة الكود، دعنا نحدد البنية. لنفترض أن لدينا ثلاث خدمات مصغرة:

\n
    \n
  • users-service - إدارة المستخدمين (المنفذ 3001).
  • \n
  • orders-service - الطلبات (المنفذ 3002).
  • \n
  • products-service - كتالوج المنتجات (المنفذ 3003).
  • \n
\n\n

العميل (الواجهة الأمامية) يتصل فقط بالبوابة على المنفذ 8080. البوابة هي التي تقرر أين ترسل الطلب.

\n\n

الخطوة 1. الإعداد الأساسي لـ Express

\n\n

لننشئ مشروعًا جديدًا ونثبت التبعيات:

\n
mkdir api-gateway\ncd api-gateway\nnpm init -y\nnpm install express http-proxy-middleware dotenv
\n\n

الآن لنكتب بوابة بسيطة تقوم بتوكيل الطلبات إلى الخدمات:

\n
// gateway.js\nconst express = require('express');\nconst { createProxyMiddleware } = require('http-proxy-middleware');\nrequire('dotenv').config();\n\nconst app = express();\nconst PORT = process.env.PORT || 8080;\n\n// مسارات الخدمات المصغرة\napp.use('/users', createProxyMiddleware({\n  target: 'http://localhost:3001',\n  changeOrigin: true,\n}));\n\napp.use('/orders', createProxyMiddleware({\n  target: 'http://localhost:3002',\n  changeOrigin: true,\n}));\n\napp.use('/products', createProxyMiddleware({\n  target: 'http://localhost:3003',\n  changeOrigin: true,\n}));\n\napp.listen(PORT, () => {\n  console.log(`API Gateway تم تشغيله على المنفذ ${PORT}`);\n});
\n\n

وهذا كل شيء! الآن أي طلب إلى /users يتم إعادة توجيهه تلقائيًا إلى users-service. لكن هذه مجرد البداية. البوابة الحقيقية يجب أن تفعل المزيد.

\n\n

إضافة المصادقة والتحقق من الرموز المميزة

\n\n

إحدى المهام الرئيسية لبوابة API هي المصادقة المركزية. بدلاً من التحقق من JWT في كل خدمة مصغرة، نقوم بذلك مرة واحدة في البوابة.

\n\n

لنضف middleware للتحقق من الرمز المميز:

\n
// middleware/auth.js\nconst jwt = require('jsonwebtoken');\n\nconst authMiddleware = (req, res, next) =>                

المدونات

توصيات الكتب