نظرة عامة
سنحول تطبيق متجانس لإدارة المكتبات إلى عدة خدمات مصغرة خطوة بخطوة.
قبل — التطبيق المتجانس
// 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