ما هو API Gateway؟
API Gateway هو نقطة دخول واحدة لجميع الطلبات إلى نظام المايكروسيرفيس. يقوم بتوجيه الطلبات، إدارة الأمان، تحديد المعدل، والتجميع.
Client → API Gateway → { user-service | order-service | payment-service }
بدونه، يجب أن يعرف تطبيق الموبايل أو الواجهة عنوان كل خدمة ويستدعيها مباشرة، ويكرّر التحقق من الهوية مع كل واحدة. مع البوابة يعرف العميل عنوانًا واحدًا فقط، فتقدر تدمج خدمتين أو تقسم خدمة إلى اثنتين دون أن يتغيّر شيء عند العميل، ما دام عقد البوابة (المسارات وشكل الردود) ثابتًا.
مثال مع Express Gateway
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
// توجيه إلى خدمة المستخدمين
app.use('/users', createProxyMiddleware({
target: 'http://user-service:3001',
changeOrigin: true,
}));
// توجيه إلى خدمة الطلبات
app.use('/orders', createProxyMiddleware({
target: 'http://order-service:3002',
changeOrigin: true,
}));
// توجيه إلى خدمة المدفوعات
app.use('/payments', createProxyMiddleware({
target: 'http://payment-service:3003',
changeOrigin: true,
}));
app.listen(8080);
المهام الرئيسية
1. التوجيه (Routing)
# مثال على قواعد التوجيه
routes:
- path: /api/users/*
service: user-service
- path: /api/orders/*
service: order-service
2. تحديد المعدل (Rate Limiting)
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
message: 'تجاوزت الحد المسموح من الطلبات',
});
app.use('/api', limiter);
3. تجميع الردود (Response Aggregation)
app.get('/dashboard', async (req, res) => {
const [user, orders, notifications] = await Promise.all([
userService.getUser(req.userId),
orderService.getOrders(req.userId),
notifService.getNotifications(req.userId),
]);
res.json({ user, orders, notifications });
});
4. المصادقة
import { AuthenticationError, AuthorizationError } from './lib/base_repository';
interface TokenRepository {
verify(token: string): Promise<User>;
}
// Repository الطبقة الوحيدة التي تتعامل مع JWT مباشرة
class JwtTokenRepository implements TokenRepository {
async verify(token: string): Promise<User> {
// التحقق من التوقيع والصلاحية — لا يوجد منطق أعمال هنا
const user = jwt.verify(token, process.env.JWT_SECRET!);
return user;
}
}
// Middleware — يستخدم Repository، لا يستدعي jwt مباشرة
async function authMiddleware(req: Request, res: Response, next: NextFunction) {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) throw new AuthenticationError('Missing token');
try {
const user = await tokenRepo.verify(token);
if (!user.isActive) throw new AuthorizationError('User deactivated');
req.user = user;
next();
} catch (err) {
if (err instanceof AuthenticationError || err instanceof AuthorizationError) {
res.status(401).json({ error: err.message });
} else {
throw err; // الأخطاء غير المتوقعة ترتفع للمعامل المركزي
}
}
}
أدوات API Gateway
- Kong — مفتوح المصدر، مع إضافات قوية
- Express Gateway — مبني على Express.js
- Nginx — خفيف وسريع
- AWS API Gateway — مدار بالكامل
أخطاء شائعة
- تحويل البوابة إلى Monolith مصغّر: وضع منطق أعمال فيها (حساب أسعار، قواعد خصم). دورها توجيه وحماية وتجميع فقط.
- نسخة واحدة من البوابة: كل الطلبات تمر بها، فأي عطل فيها يوقف النظام كله. اجعلها عديمة الحالة (stateless) وشغّل عدة نسخ خلف Load Balancer.
- التحقق من الهوية في البوابة فقط ثم الثقة العمياء داخليًا: الخدمات الداخلية يجب ألا تكون مكشوفة للإنترنت مباشرة، وإلا يتجاوز المهاجم البوابة كلها.
⚠️ لا تضع منطق أعمال في الـ Gateway — دوره توجيه وأمان فقط
🎯 التالي: اكتشاف الخدمات (Service Discovery)