معماری میکروسرویس چیست؟

معماری میکروسرویس رویکردی برای توسعه نرم‌افزار است که در آن یک برنامه بزرگ به سرویس‌های کوچک و مستقل تقسیم می‌شود.

مزایای معماری میکروسرویس

  • مقیاس‌پذیری مستقل: هر سرویس به طور مستقل قابل مقیاس‌دهی است
  • توسعه موازی: تیم‌های مختلف می‌توانند همزمان روی سرویس‌های مختلف کار کنند
  • انعطاف‌پذیری تکنولوژی: امکان استفاده از تکنولوژی‌های مختلف برای هر سرویس
  • مقاومت در برابر خطا: خطا در یک سرویس کل سیستم را مختل نمی‌کند

اجزای اصلی

  1. API Gateway: نقطه ورود واحد برای کلیه درخواست‌ها
  2. Service Discovery: مکانیسم یافتن سرویس‌ها
  3. پیام‌رسانی: ارتباط بین سرویس‌ها (RabbitMQ, Kafka)
  4. لاگ‌گیری متمرکز
  5. مانیتورینگ

پیاده‌سازی با Node.js

// سرویس کاربران - user-service.js
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3001;

app.get("/users/:id", async (req, res) => {
    const userId = req.params.id;
    // دریافت اطلاعات کاربر از دیتابیس
    const user = await getUserFromDB(userId);
    res.json(user);
});

app.listen(PORT, () => {
    console.log(`User Service running on port ${PORT}`);
});

// سرویس محصولات - product-service.js
const express = require("express");
const app2 = express();
const PORT2 = process.env.PORT || 3002;

app2.get("/products/:id", async (req, res) => {
    const productId = req.params.id;
    // دریافت اطلاعات محصول از دیتابیس
    const product = await getProductFromDB(productId);
    res.json(product);
});

app2.listen(PORT2, () => {
    console.log(`Product Service running on port ${PORT2}`);
});

کانتینری‌سازی با Docker

Docker هر میکروسرویس را در یک کانتینر مجزا اجرا می‌کند:

# Dockerfile برای سرویس کاربران
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
CMD ["npm", "start"]

# docker-compose.yml
version: "3.8"
services:
  user-service:
    build: ./user-service
    ports:
      - "3001:3001"
  product-service:
    build: ./product-service
    ports:
      - "3002:3002"
  api-gateway:
    build: ./api-gateway
    ports:
      - "8080:8080"

چالش‌ها و راه‌حل‌ها

  • مدیریت داده توزیع‌شده: استفاده از الگوی Saga
  • تراکنش‌های توزیع‌شده: استفاده از پیام‌رسانی ناهمگام
  • تست‌پذیری: تست هر سرویس به صورت مستقل