تخطَّ إلى المحتوى

🏗️ شرح المايكروسيرفيس (Microservices)

مشروع: تحويل Monolith إلى Microservices

الدرس 16 من 25· ⏱ 2 دقائق قراءة

نظرة عامة

سنحول تطبيق متجانس لإدارة المكتبات إلى عدة خدمات مصغرة خطوة بخطوة.

قبل — التطبيق المتجانس

// monolith.js — تطبيق متجانس
const express = require('express');
const app = express();

// كل شيء في ملف واحد
app.get('/books', getAllBooks);
app.post('/books', createBook);
app.get('/users', getAllUsers);
app.post('/users', createUser);
app.post('/borrow', borrowBook);
app.post('/return', returnBook);

app.listen(3000);

بعد — التقسيم إلى خدمات

microservices:
  book-service:    # إدارة الكتب
  user-service:   # إدارة المستخدمين
  loan-service:   # إدارة الاستعارة
  notification-service:  # إشعارات

الخطوة 1: استخراج Book Service

// book-service/index.js
const express = require('express');
const { books } = require('./models');
const app = express();

app.use(express.json());

app.get('/books', async (req, res) => {
  const all = await books.findAll();
  res.json(all);
});

app.post('/books', async (req, res) => {
  const book = await books.create(req.body);
  res.status(201).json(book);
});

app.get('/books/:id', async (req, res) => {
  const book = await books.findById(req.params.id);
  if (!book) return res.status(404).json({ error: 'الكتاب غير موجود' });
  res.json(book);
});

app.listen(3001);

الخطوة 2: Loan Service مع Events

// loan-service/index.js
const express = require('express');
const { loans } = require('./models');
const eventBus = require('./eventBus');
const app = express();

app.use(express.json());

app.post('/loans', async (req, res) => {
  const { userId, bookId } = req.body;

  const loan = await loans.create({ userId, bookId, date: new Date() });

  // نشر حدث
  await eventBus.publish('book.borrowed', {
    loanId: loan.id,
    userId,
    bookId,
    date: loan.date,
  });

  res.status(201).json(loan);
});

app.post('/loans/:id/return', async (req, res) => {
  const loan = await loans.returnBook(req.params.id);
  await eventBus.publish('book.returned', { loanId: loan.id });
  res.json(loan);
});

app.listen(3002);

الخطوة 3: Notification Service

// notification-service/index.js
const eventBus = require('./eventBus');

eventBus.subscribe('book.borrowed', async (event) => {
  console.log(`إرسال إشعار: المستخدم ${event.userId} استعار الكتاب ${event.bookId}`);
  await sendEmail(event.userId, 'تم استعارة الكتاب بنجاح');
});

eventBus.subscribe('book.returned', async (event) => {
  console.log(`إشعار إعادة: ${event.loanId}`);
  await sendEmail(event.userId, 'تم إعادة الكتاب');
});

الهيكل النهائي

project/
├── book-service/
│   ├── index.js
│   ├── models.js
│   └── package.json
├── user-service/
│   ├── index.js
│   ├── models.js
│   └── package.json
├── loan-service/
│   ├── index.js
│   ├── models.js
│   ├── eventBus.js
│   └── package.json
├── notification-service/
│   ├── index.js
│   ├── email.js
│   └── package.json
└── docker-compose.yml

⚠️ ابدأ بخدمة واحدة — لا تحاول تحويل كل شيء دفعة واحدة (Strangler Fig Pattern)

🎯 التالي: 16-project-ad-platform

شرح مشروع: تحويل Monolith إلى Microservices — المايكروسيرفيس (Microservices) بالعربي
مشروع: تحويل Monolith إلى Microservicesالمايكروسيرفيس (Microservices) بالعربي · The Code Fix

هل كان هذا الدرس مفيدًا؟