ميكروسيرفيسات JavaScript: من الصفر إلى أول خدمة في 20 دقيقة

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

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

ابدأ الدورة

ميكروسيرفيسات JavaScript: من أين تبدأ حتى لا تتوقف بعد أسبوع؟

\n\n

هل تساءلت يومًا لماذا تحولت المشاريع الكبيرة مثل Netflix وUber وAmazon إلى الميكروسيرفيسات؟ الأمر ليس موضة - بل مسألة بقاء. عندما يصبح حجم تطبيقك المتجانس (Monolith) 50 جيجابايت وفريق التطوير 100 شخص، كل تغيير في الكود يتحول إلى لعبة روليت روسية.

\n\n

لكن الخبر السار هو: الميكروسيرفيسات بلغة JavaScript ليست علم الصواريخ. اليوم سأريك كيف تبني بنية عمل متكاملة في 20 دقيقة، لن تخجل من عرضها في مقابلة عمل أو استخدامها في مشروعك الشخصي.

\n\n

ما هو الميكروسيرفيس (الخدمة المصغرة) بكلمات بسيطة؟

\n\n

تخيل سكينًا سويسريًا. في البنية المتجانسة (Monolithic)، هو سكين كبير واحد بمئة شفرة. إذا انكسرت واحدة، ترمي الكل. أما الميكروسيرفيسات فهي مجموعة من السكاكين المنفصلة، كل منها لمهمة محددة. انكسر واحد؟ نستبدله فقط.

\n\n
الميكروسيرفيس هو تطبيق صغير مستقل يقوم بشيء واحد، لكنه يفعله بشكل ممتاز.
\n\n

لماذا JavaScript مثالية للميكروسيرفيسات؟

\n\n
    \n
  • Event Loop: غير متزامن (Async) بشكل افتراضي - مثالي للمهام المرتبطة بالإدخال/الإخراج (I/O)
  • \n
  • NPM: أكثر من 2 مليون حزمة، نظام بيئي جاهز لكل شيء
  • \n
  • Node.js: عمليات خفيفة الوزن، إقلاع سريع (50-100 مللي ثانية)
  • \n
  • TypeScript: كتابة الأنواع (Typing) التي تنقذك في الأنظمة الموزعة
  • \n
  • لغة موحدة: الواجهة الأمامية والخلفية بلغة JS - تقليل التبديل بين السياقات
  • \n
\n\n

من أين تبدأ: خارطة طريق عملية

\n\n

الخطوة 1. الأساسيات: Express + Docker

\n\n

انسَ Kubernetes في البداية. أنت بحاجة إلى ميكروسيرفيس Node.js يمكن تشغيله بأمر واحد. لنبدأ بأبسط شيء - خدمة ترحيب.

\n\n

إنشاء أول ميكروسيرفيس

\n\n
// service-greeting/index.js\nconst express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/api/hello', (req, res) => {\n  res.json({ \n    message: 'مرحبًا من الميكروسيرفيس!',\n    timestamp: new Date().toISOString(),\n    service: 'greeting'\n  });\n});\n\napp.listen(PORT, () => {\n  console.log(`Greeting service running on port ${PORT}`);\n});\n
\n\n

الآن نغلف هذا في Docker:

\n\n
# Dockerfile\nFROM node:18-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 3000\nCMD ["node", "index.js"]\n
\n\n

الخطوة 2. Docker Compose: تنسيق الخدمات بطريقة بسيطة

\n\n

لا تركض وراء Kubernetes. للبدء، Docker Compose هو أفضل صديق لك. لننشئ خدمتين ونربطهما معًا.

\n\n
# docker-compose.yml\nversion: '3.8'\nservices:\n  greeting:\n    build: ./service-greeting\n    ports:\n      - "3001:3000"\n    environment:\n      - PORT=3000\n\n  users:\n    build: ./service-users\n    ports:\n      - "3002:3000"\n    environment:\n      - PORT=3000\n      - GREETING_SERVICE=http://greeting:3000\n
\n\n

الخطوة 3. ربط الخدمات: HTTP مقابل Message Broker

\n\n

في هندسة الميكروسيرفيسات بلغة JavaScript، هناك طريقتان للتواصل:

\n\n
    \n
  • متزامن (HTTP): بسيط وواضح، لكنه يخلق تبعية
  • \n
  • غير متزامن (RabbitMQ/Kafka): أكثر تعقيدًا لكنه أكثر موثوقية
  • \n
\n\n

مثال على التواصل عبر HTTP بين الخدمات

\n\n
// service-users/index.js\nconst express = require('express');\nconst axios = require('axios');\nconst app = express();\n\napp.get('/api/user/:id', async (req, res) => {\n  try {\n    // استدعاء ميكروسيرفيس آخر\n    const greeting = await axios.get(\n      `${process.env.GREETING_SERVICE}/api/hello`\n    );\n    \n    res.json({\n      userId: req.params.id,\n      greeting: greeting.data.message\n    });\n  } catch (error) {\n    res.status(500).json({ error: 'الخدمة غير متاحة' });\n  }\n});\n\napp.listen(3000);\n

المدونات

توصيات الكتب