ميكروسيرفيسات TypeScript: خطوتك الأولى نحو بنية معيارية
\n\nتخيل أنك تبني منزلاً. يمكنك بناء جدار واحد ضخم ثم إضافة الغرف إليه. لكن إذا تعطلت غرفة واحدة، سيتأثر المبنى بأكمله. البديل هو بناء وحدات منفصلة: مطبخ، غرفة نوم، غرفة معيشة، كل منها بتمديداتها الكهربائية والسباكة الخاصة بها. هذه هي فكرة عمل الميكروسيرفيسات (الخدمات المصغرة) — مكونات مستقلة ومرتبطة بشكل ضعيف تتواصل عبر الشبكة.
\n\nاستخدام TypeScript للميكروسيرفيسات ليس مجرد موضة عابرة، بل أداة تنقذك من الفوضى. فالكتابة الثابتة (Static Typing) تكتشف الأخطاء في مرحلة الترجمة وليس في بيئة الإنتاج. في هذا المقال، سنشرح من أين تبدأ إذا كنت ترغب في الانتقال من البنية المتجانسة (Monolith) إلى الميكروسيرفيسات باستخدام TypeScript. بدون حشو، مع أمثلة كود حقيقية.
\n\nلماذا TypeScript بدلاً من JavaScript النقي؟
\n\nعند كتابة الميكروسيرفيسات، كل خدمة هي مشروع مستقل. بدون أنواع، من السهل الخلط: ما هو تنسيق البيانات الذي تتوقعه الخدمة A؟ وماذا ترجع الخدمة B؟ TypeScript يحل هذه المشكلة:
\n\n- \n
- الواجهات (Interfaces) والأنواع (Types) — تحدد بوضوح العقود بين الخدمات. \n
- الإكمال التلقائي وإعادة الهيكلة (Refactoring) — بيئة التطوير تقترح حقول الكائنات، وإعادة التسمية لا تكسر الكود. \n
- التوافق مع Node.js — TypeScript يُترجم إلى JavaScript ويعمل في أي مكان يتوفر فيه Node. \n
مثال: تخيل أن خدمة الطلبات ترسل بيانات إلى خدمة التوصيل. بدون أنواع، قد ترسل نصاً (string) بدلاً من رقم (number). TypeScript سيقول لك: "مرحباً، هنا يُتوقع رقم، لكنك ترسل نصاً".
\n\nالأدوات اللازمة للبدء
\n\nللبدء، ستحتاج إلى:
\n\n- \n
- Node.js (الإصدار 18+) — بيئة التشغيل. \n
- TypeScript — يُثبت بشكل عام أو داخل المشروع. \n
- NestJS — إطار عمل لتطبيقات الخادم. يدعم بنية الميكروسيرفيسات بشكل افتراضي. \n
- RabbitMQ أو NATS — وسطاء الرسائل للتواصل غير المتزامن. \n
- Docker — للحاويات (Containerization) لكل خدمة. \n
لا تقلق، كل هذا يمكن إعداده في 15 دقيقة.
\n\nالخطوة 1: إنشاء أول ميكروسيرفيس باستخدام NestJS
\n\nNestJS يشبه Angular من ناحية الخادم. يستخدم الديكوراتورات (Decorators) والوحدات (Modules) والموفرين (Providers). لنقم بتثبيته:
\n\nnpm i -g @nestjs/cli\nnest new user-service\ncd user-service\nnpm install @nestjs/microservices\n\nالآن، سنحول التطبيق العادي إلى ميكروسيرفيس. افتح ملف main.ts:
import { NestFactory } from '@nestjs/core';\nimport { MicroserviceOptions, Transport } from '@nestjs/microservices';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.createMicroservice<MicroserviceOptions>(\n AppModule,\n {\n transport: Transport.TCP, // أو Redis, RabbitMQ\n options: {\n host: '0.0.0.0',\n port: 3001,\n },\n },\n );\n await app.listen();\n console.log('خدمة المستخدم تستمع على المنفذ 3001');\n}\nbootstrap();\n\nلقد أنشأنا ميكروسيرفيس يستمع على منفذ TCP 3001. الآن، أضف معالج رسائل في app.controller.ts:
import { Controller } from '@nestjs/common';\nimport { MessagePattern, Payload } from '@nestjs/microservices';\n\n@Controller()\nexport class AppController {\n @MessagePattern('get_user')\n getUser(@Payload() data: { id: number }) {\n // محاكاة استعلام لقاعدة البيانات\n return { id: data.id, name: 'أحمد', email: 'ahmed@example.com' };\n }\n}\n\nتمام! أول ميكروسيرفيس جاهز. يستقبل رسالة بنمط get_user ويعيد بيانات المستخدم.
الخطوة 2: إنشاء خدمة ثانية وتنظيم التواصل
\n\nلنقم بإنشاء خدمة أخرى — order-service. ستقوم بطلب بيانات من user-service.