الرئيسية / المدونة / بوابة API باستخدام NestJS: توجيه الطلبات بين الخدمات، التوثيق، وتحديد المعدل (Rate Limiting)
بوابة API باستخدام NestJS: توجيه الطلبات بين الخدمات، التوثيق، وتحديد المعدل (Rate Limiting)

بوابة API باستخدام NestJS: توجيه الطلبات بين الخدمات، التوثيق، وتحديد المعدل (Rate Limiting)

مميز

بوابة API باستخدام NestJS: توجيه الطلبات بين الخدمات، التوثيق، وتحديد المعدل (Rate Limiting)

a

admin

المؤلف

25 دقيقة قراءة
36 المشاهدات
25 يونيو 2025

تعلم كيفية بناء بوابة API قوية باستخدام NestJS لتوجيه الطلبات بين الخدمات المصغرة، تطبيق التوثيق، والتحكم في معدل الطلبات. دليل عملي واحترافي لبنية مايكرو سيرفيس قابلة للتوسع.

📦 بوابة API باستخدام NestJS: توجيه متعدد الخدمات، التوثيق، وتحديد المعدل

التطبيقات الحديثة لم تعد مبنية على شكل وحدات ضخمة (Monoliths). بل أصبحت مكونة من خدمات مصغرة (Microservices) — خدمات صغيرة يتم تطويرها ونشرها بشكل مستقل، وكل واحدة تؤدي وظيفة معينة.

لكن كلما زاد عدد الخدمات، أصبح من الضروري وجود نقطة دخول واحدة تقوم بـ:

  • توجيه الطلبات إلى الخدمة المناسبة
  • التحقق من المستخدمين
  • تطبيق حماية ضد إساءة الاستخدام (Rate Limiting)
  • توحيد الردود وجمعها

هنا تأتي أهمية بوابة API (API Gateway).

في هذا الدليل العملي، سأريك كيف تبني بوابة API مرنة باستخدام NestJS تشمل:

  • توجيه ديناميكي باستخدام HTTP Proxy
  • حُراس (Guards) للتحقق من التوثيق
  • تحديد معدل الطلبات لمنع إساءة الاستخدام
  • دعم تعدد الخدمات بطريقة نظيفة وقابلة للتوسعة

لنبدأ الآن! 🚀

🧠 ما هي بوابة API؟

بوابة الـ API هي طبقة أمامية واحدة تتعامل مع جميع الطلبات من الواجهة الأمامية، ثم توجهها إلى الخدمات المصغرة المناسبة في الخلفية.

🔁 مثال مبسط:

واجهة المستخدم → API Gateway → خدمة التوثيق  
                                → خدمة المستخدمين  
                                → خدمة الطلبات

بدلاً من استدعاء كل خدمة مباشرة، تتصل الواجهة فقط بالبوابة، مما يُبسط البنية ويوفر تحكمًا مركزيًا.

🏗️ إعداد المشروع

ابدأ بإنشاء مشروع جديد لـ API Gateway:

npx @nestjs/cli new api-gateway
cd api-gateway

ثم قم بتثبيت الحزم الضرورية:

npm install --save axios @nestjs/throttler

نحن نستخدم:

  • axios لتوجيه الطلبات بين الخدمات
  • @nestjs/throttler لتطبيق تحديد معدل الطلبات

🗂️ هيكلية المشروع (مبسطة)

src/
├── main.ts
├── gateway.controller.ts
├── gateway.service.ts
├── auth.guard.ts
├── throttler.guard.ts
├── app.module.ts

🔀 1. توجيه الطلبات إلى الخدمات المصغرة

لنقل أننا نريد التوجيه كالتالي:

  • /auth/login → خدمة التوثيق
  • /users/profile → خدمة المستخدمين

🧩 gateway.service.ts

import { Injectable } from '@nestjs/common';
import axios, { AxiosRequestConfig } from 'axios';

@Injectable()
export class GatewayService {
  private services = {
    auth: 'http://localhost:3001',
    users: 'http://localhost:3002',
  };

  async forward(service: 'auth' | 'users', path: string, method: string, body: any, headers: any) {
    const url = `${this.services[service]}${path}`;
    const config: AxiosRequestConfig = {
      method,
      url,
      headers,
      data: body,
    };
    const res = await axios(config);
    return res.data;
  }
}

🎮 2. إنشاء وحدة التحكم في البوابة

import {
  Controller,
  Req,
  Res,
  All,
  UseGuards,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { Request, Response } from 'express';
import { GatewayService } from './gateway.service';
import { AuthGuard } from './auth.guard';
import { ThrottlerGuard } from './throttler.guard';

@Controller()
export class GatewayController {
  constructor(private gatewayService: GatewayService) {}

  @All('*')
  @UseGuards(ThrottlerGuard, AuthGuard)
  async proxy(@Req() req: Request, @Res() res: Response) {
    try {
      const [_, service, ...restPath] = req.path.split('/');
      const path = '/' + restPath.join('/');
      const data = await this.gatewayService.forward(
        service as 'auth' | 'users',
        path,
        req.method,
        req.body,
        req.headers,
      );
      res.json(data);
    } catch (error) {
      throw new HttpException(error?.response?.data || 'Service Error', HttpStatus.BAD_GATEWAY);
    }
  }
}

هذا الكود يعترض جميع الطلبات (@All('*')) ويوجهها ديناميكيًا إلى الخدمة المناسبة حسب المسار.

🔐 3. إضافة Guard للتوثيق

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const req = context.switchToHttp().getRequest();
    const auth = req.headers['authorization'];
    return !!auth; // فقط تأكد من وجود Header التوثيق
  }
}

في الإنتاج، يمكنك التحقق من رمز JWT أو إرسال الطلب إلى خدمة التوثيق للتحقق من الصلاحيات.

🧃 4. تطبيق Rate Limiting

import { Injectable } from '@nestjs/common';
import {
  ThrottlerGuard as BaseThrottlerGuard,
  ThrottlerModule,
} from '@nestjs/throttler';

@Injectable()
export class ThrottlerGuard extends BaseThrottlerGuard {}

ثم أضفها في app.module.ts:

import { Module } from '@nestjs/common';
import { ThrottlerModule } from '@nestjs/throttler';
import { GatewayController } from './gateway.controller';
import { GatewayService } from './gateway.service';
import { AuthGuard } from './auth.guard';
import { ThrottlerGuard } from './throttler.guard';

@Module({
  imports: [
    ThrottlerModule.forRoot({
      ttl: 60, // ثانية
      limit: 10, // عدد الطلبات المسموحة لكل IP
    }),
  ],
  controllers: [GatewayController],
  providers: [GatewayService, AuthGuard, ThrottlerGuard],
})
export class AppModule {}

🔌 5. ملاحظة إضافية: دعم بروتوكول TCP

إذا كنت تستخدم خدمات تعتمد على TCP بدلاً من HTTP، يمكنك استخدام ClientProxy من NestJS.

(وإذا أردت مقال منفصل يشرح هذا النموذج بالتفصيل، أخبرني فقط ✨)

✅ الخلاصة

بوابة الـ API جزء أساسي من أي نظام خدمات مصغرة في بيئة الإنتاج.

باستخدام NestJS يمكنك بناءها بشكل:

  • نظيف
  • قابل للتوسع
  • سهل الصيانة
  • وقوي أمنيًا

من خلال الدمج بين:

  • التوجيه الديناميكي
  • التحقق من المستخدمين
  • تحديد معدل الطلبات
  • التحكم في جميع الخدمات من نقطة مركزية

…تحصل على نظام مرن وآمن ويمكنك تطويره بسهولة.

🔗 مصادر إضافية

🙌 هل وجدت المقال مفيدًا؟

إذا أعجبك هذا الدليل، لا تتردد في مشاركته مع أي شخص يعمل على NestJS أو يريد بناء خدمات مصغرة بطريقة صحيحة.

شارك هذا المنشور

تم نسخ الرابط