API Gateway للخدمات المصغرة باستخدام TypeScript: دليل كامل

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

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

ابدأ الدورة

مقدمة: لماذا يحتاج مشروعك إلى API Gateway؟

\n\n

تخيل: أنت تكتب شركة ناشئة أو تطبيق مؤسسي باستخدام TypeScript. لديك بالفعل خدمة مستخدمين، وخدمة طلبات، وخدمة إشعارات. كل منها يعمل على منفذه الخاص (أو حتى على خادمه الخاص)، ويتواصل عبر HTTP، ويستخدم قاعدة بياناته الخاصة. كل شيء يعمل، لكن العميل (الواجهة الأمامية، التطبيق المحمول) يبدأ في المعاناة: لتجميع صفحة الملف الشخصي، يحتاج إلى إجراء 4-5 طلبات لخدمات مختلفة، والتعامل مع تنسيقات أخطاء مختلفة، بالإضافة إلى تسجيل الدخول في كل منها.

\n\n

هنا يظهر API Gateway — نقطة دخول موحدة لجميع العملاء. يتولى التوجيه، والمصادقة، وتجميع البيانات، والتخزين المؤقت، وحتى تحويل الاستجابات. في هذه المقالة، سنكتب API Gateway حقيقي باستخدام TypeScript من الصفر، وسنناقش الأنماط والأنماط المضادة، ونوضح كيفية تجنب الأخطاء الشائعة.

\n\n

ما هو API Gateway بكلمات بسيطة

\n\n

API Gateway هو طبقة وسيطة بين العميل وخدماتك الداخلية. العميل (المتصفح، التطبيق المحمول، API خارجي) يتصل فقط بـ Gateway. ينظر Gateway إلى مسار الطلب، ويتحقق من الرمز المميز (token)، ويعيد توجيه الطلب إلى الخدمة المصغرة المناسبة. أحيانًا يقوم بتجميع الاستجابة من عدة خدمات في استجابة واحدة — وهذا يسمى التجميع (aggregation).

\n\n

لماذا هذا ضروري في بيئة TypeScript؟ لأن TypeScript يوفر لنا الأنواع (types)، والواجهات (interfaces)، والدقة، وGateway هو المكان المثالي للتحقق من صحة البيانات وتحويلها إلى عقد موحد.

\n\n

الهندسة المعمارية: كيف تعمل على TypeScript

\n\n

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

\n\n
    \n
  • Gateway (خدمة TypeScript الخاصة بنا) — المنفذ 3000، نقطة الدخول الوحيدة.
  • \n
  • خدمة المستخدمين (User Service) — المنفذ 4001، REST API.
  • \n
  • خدمة الطلبات (Order Service) — المنفذ 4002، REST API.
  • \n
  • خدمة الإشعارات (Notification Service) — المنفذ 4003، REST API.
  • \n
\n\n

جميع الخدمات الداخلية تعيش في شبكتها الخاصة (مثل Docker network) ولا تكون مرئية من الخارج. يتواصل العميل فقط مع Gateway.

\n\n
// هيكل المشروع\ngateway/\n├── src/\n│   ├── routes/\n│   │   ├── userRoutes.ts\n│   │   ├── orderRoutes.ts\n│   │   └── notificationRoutes.ts\n│   ├── middleware/\n│   │   ├── authMiddleware.ts\n│   │   ├── rateLimiter.ts\n│   │   └── cacheMiddleware.ts\n│   ├── services/\n│   │   └── proxyService.ts\n│   ├── types/\n│   │   └── index.ts\n│   └── index.ts\n├── package.json\n└── tsconfig.json\n
\n\n

كتابة API Gateway أساسي باستخدام TypeScript

\n\n

لنبدأ بتثبيت التبعيات. سنحتاج إلى Express (الإطار الأكثر شيوعًا)، و http-proxy-middleware للوكيل، وبعض الأدوات المساعدة.

\n\n
npm init -y\nnpm install express http-proxy-middleware cors helmet express-rate-limit\nnpm install -D typescript @types/node @types/express ts-node nodemon\n
\n\n

لننشئ tsconfig.json:

\n\n
{\n  "compilerOptions": {\n    "target": "ES2020",\n    "module": "commonjs",\n    "outDir": "./dist",\n    "rootDir": "./src",\n    "strict": true,\n    "esModuleInterop": true,\n    "skipLibCheck": true,\n    "forceConsistentCasingInFileNames": true\n  },\n  "include": ["src/**/*"],\n  "exclude": ["node_modules"]\n}\n
\n\n

الآن لنكتب الملف الرئيسي src/index.ts:

\n\n
import express, { Request, Response } from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport { createProxyMiddleware } from 'http-proxy-middleware';\nimport { authMiddleware } from './middleware/authMiddleware';\nimport { rateLimiter } from './middleware/rateLimiter';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\n// Middleware عامة\napp.use(helmet());\napp.use(cors());\napp.use(express.json());\napp.use(rateLimiter);\n\n// وكيل لخدمة المستخدمين\napp.use('/api/users', auth                

المدونات

توصيات الكتب