ميكروسيرفيسات بلغة JavaScript: الهندسة والممارسة لـ Node.js

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

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

ابدأ الدورة
```html

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



أصبحت هندسة الميكروسيرفيسات (MSA) المعيار الفعلي لبناء تطبيقات معقدة وقابلة للتوسع ومقاومة للأعطال. على عكس التطبيق المتجانس (Monolith)، حيث يكون كل الكود مرتبطًا في عملية واحدة، تقوم الميكروسيرفيسات بتقسيم النظام إلى خدمات صغيرة ومستقلة. JavaScript، وتحديدًا منصة Node.js، بفضل نموذجها القائم على الأحداث (Event-Driven) ونظامها البيئي الضخم، هي خيار ممتاز لتنفيذ الميكروسيرفيسات. في هذه المقالة، سنقوم بتحليل المبادئ الأساسية للهندسة، وكتابة عدة خدمات عاملة، واستعراض الجوانب العملية للتفاعل بينها.



المبادئ الأساسية لهندسة الميكروسيرفيسات



قبل كتابة الكود، من المهم فهم ما الذي يجعل الميكروسيرفيس "ميكروسيرفيسًا". المبادئ الأساسية هي:



  • المسؤولية الواحدة (Single Responsibility): كل خدمة تحل مهمة عمل محددة واحدة (مثل: المصادقة فقط أو إدارة الطلبات فقط).
  • الاستقلالية: يتم تطوير الخدمات واختبارها ونشرها بشكل مستقل عن بعضها البعض.
  • عزل البيانات: كل خدمة لها قاعدة البيانات الخاصة بها. لا يوجد مستودع مشترك.
  • الترابط الضعيف (Loose Coupling): تتواصل الخدمات عبر الشبكة (API)، وليس عبر استدعاءات دوال مباشرة.
  • مقاومة الأعطال: يجب ألا يؤدي عطل في خدمة واحدة إلى انهيار النظام بأكمله.


تعتبر Node.js مثالية لهذه المهام بفضل طبيعتها غير المحظورة (Non-blocking) وعدم تزامنها (Asynchronous)، وهو أمر بالغ الأهمية عند وجود عدد كبير من الاستدعاءات الشبكية بين الخدمات.



التطبيق العملي: إنشاء ميكروسيرفيسين بسيطين



لنكتب خدمتين بسيطتين باستخدام Express.js: User Service (إدارة المستخدمين) و Order Service (إدارة الطلبات).



1. User Service (خدمة المستخدمين)

قم بإنشاء ملف user-service/server.js:



const express = require('express');const app = express();app.use(express.json());

const users = [{ id: 1, name: 'Alice', email: 'alice@example.com' }];

app.get('/users/:id', (req, res) => { const user = users.find(u => u.id === parseInt(req.params.id)); if (!user) return res.status(404).json({ error: 'User not found' }); res.json(user);});

app.listen(3001, () => console.log('User Service running on port 3001'));


2. Order Service (خدمة الطلبات)

قم بإنشاء ملف order-service/server.js:



const express = require('express');const app = express();app.use(express.json());

const orders = [ { id: 1, userId: 1, product: 'Laptop', amount: 1500 }];

app.get('/orders/user/:userId', (req, res) => { const userOrders = orders.filter(o => o.userId === parseInt(req.params.userId)); res.json(userOrders);});

app.listen(3002, () => console.log('Order Service running on port 3002'));


الآن لدينا خدمتان مستقلتان تعملان على منافذ مختلفة. هذا هو أساس هندسة الميكروسيرفيسات.



التفاعل بين الخدمات: REST و Message Broker



يجب أن تتواصل الخدمات. سنستعرض طريقتين رئيسيتين.



3.1 التفاعل المتزامن (REST API)

تقوم خدمة باستدعاء API لخدمة أخرى مباشرة. على سبيل المثال، للحصول على الطلبات مع اسم المستخدم، سننشئ API Gateway أو خدمة تجميع (Service Composer).



// api-gateway.jsconst axios = require('axios');

app.get('/users/:id/orders', async (req, res) => { try { const userResponse = await axios.get(`http://localhost:3001/users/${req.params.id}`); const ordersResponse = await axios.get(`http://localhost:3002/orders/user/${req.params.id}`); res.json({ user: userResponse.data, orders: ordersResponse.data }); } catch (error) { res.status(```

المدونات

توصيات الكتب