ميكروسيرفيسات 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الخطوة 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
مثال على التواصل عبر 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