میکروسرویسها (Microservices) یک سبک معماری نرمافزاری هستند که در آن سیستم بزرگ به مجموعهای از سرویسهای کوچک، مستقل و قابل استقرار جداگانه تقسیم میشود. هر سرویس معمولاً یک وظیفهی مشخص (business capability) دارد و میتواند به طور مستقل توسعه، تست، استقرار و مقیاسپذیری شود.

🔹 ویژگیهای اصلی میکروسرویسها
- استقلال: هر سرویس جدا از بقیه توسعه و استقرار میشود.
- ارتباط سبکوزن: معمولاً از REST API، gRPC، یا Messaging (مثل RabbitMQ, Kafka) استفاده میشود.
- پایگاه داده مستقل: هر سرویس میتواند دیتابیس مخصوص خود را داشته باشد.
- مقیاسپذیری جداگانه: فقط سرویس مورد نیاز scale میشود نه کل سیستم.
- فناوری متنوع: سرویسها میتوانند با زبانها یا تکنولوژیهای مختلف ساخته شوند.
🔹 ملزومات برای پیادهسازی در ASP.NET Core
برای ساخت میکروسرویس با ASP.NET Core معمولاً به موارد زیر نیاز دارید:
-
ایجاد API مستقل
-
هر میکروسرویس یک پروژهی ASP.NET Core Web API است.
-
ساختار سبک (Controllerها یا Minimal APIs).
-
-
ارتباط بین سرویسها
-
HTTP/REST: سادهترین روش، با استفاده از
HttpClient
یاRefit
. -
gRPC: سریعتر و مناسب سرویسهای داخلی.
-
پیاممحور (Event-Driven): با RabbitMQ, Kafka, Azure Service Bus.
-
-
پایگاه داده مجزا
-
استفاده از EF Core یا Dapper برای هر سرویس.
-
دیتابیس جداگانه برای جلوگیری از coupling.
-
-
Service Discovery و API Gateway
-
برای مدیریت ارتباطات و جلوگیری از سختکدنویسی آدرسها.
-
ابزارها: Ocelot, YARP, یا Kong.
-
-
Authentication و Authorization
-
استفاده از IdentityServer4, OpenIddict یا Azure AD.
-
معماری JWT برای انتقال امن توکن بین سرویسها.
-
-
Logging و Monitoring
-
استفاده از Serilog, Seq, Elastic Stack (ELK) یا Application Insights.
-
-
Containerization و Orchestration
-
ساخت و استقرار سرویسها داخل Docker.
-
مدیریت و مقیاسپذیری با Kubernetes (K8s).
-
-
Resilience و Fault Tolerance
-
پیادهسازی Retry، Circuit Breaker، Timeout.
-
استفاده از Polly در ASP.NET Core.
-
✅ به زبان ساده:
برای داشتن میکروسرویس در ASP.NET Core باید هر قابلیت مهم را به یک Web API مستقل تبدیل کنید، ارتباطات آنها را با API Gateway و Messaging مدیریت کنید، امنیت را با JWT/IdentityServer تضمین کنید و همه چیز را در Docker/Kubernetes مستقر کنید.
📦 معماری نمونه: سیستم فروش آنلاین (E-commerce)
🔹 سرویسها
-
Product Service
-
مدیریت محصولات (نام، قیمت، موجودی)
-
دیتابیس جداگانه (مثلاً SQL Server)
-
-
Order Service
-
ثبت سفارش و مدیریت وضعیت سفارشها
-
دیتابیس جداگانه (مثلاً PostgreSQL)
-
برای گرفتن اطلاعات محصول، به سرویس Product درخواست میزند
-
-
Customer Service
-
مدیریت مشتریان و پروفایلها
-
دیتابیس جداگانه
-
-
API Gateway (مثلاً با Ocelot یا YARP)
-
نقطه ورود یکپارچه برای کلاینتها (وب/موبایل)
-
مدیریت Routing، Authentication، Rate Limiting
-
🔹 ارتباط بین سرویسها
-
سینکرون (HTTP/gRPC):
وقتی Order Service نیاز دارد اطلاعات محصول را بخواند → درخواست به Product Service میزند. -
غیرسینکرون (Message Broker):
وقتی سفارشی ثبت میشود → Order Service یک پیام "OrderCreated" در RabbitMQ منتشر میکند → سرویسهای دیگر (مثل Inventory یا Notification) آن رو گوش میدهند.
🔹 ساختار پوشهها (نمونه)
ECommerce.Microservices/ │ ├── api-gateway/ --> Ocelot یا YARP │ ├── services/ │ ├── product-service/ --> ASP.NET Core Web API + SQL Server │ ├── order-service/ --> ASP.NET Core Web API + PostgreSQL │ └── customer-service/ --> ASP.NET Core Web API + MongoDB │ ├── shared/ --> DTO ها، پکیجهای مشترک (مثلاً JWT utils) │ └── docker-compose.yml --> اجرای همه سرویسها + دیتابیسها + RabbitMQ
🔹 نمونه کد ساده (Product Service - ASP.NET Core Minimal API)
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<ProductDbContext>(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.MapGet("/products", async (ProductDbContext db) => await db.Products.ToListAsync()); app.MapPost("/products", async (Product product, ProductDbContext db) => { db.Products.Add(product); await db.SaveChangesAsync(); return Results.Created($"/products/{product.Id}", product); }); app.Run();
🔹 API Gateway (Ocelot.json نمونه)
{ "Routes": [ { "DownstreamPathTemplate": "/products", "DownstreamScheme": "http", "DownstreamHostAndPorts": [{ "Host": "localhost", "Port": 5001 }], "UpstreamPathTemplate": "/api/products", "UpstreamHttpMethod": [ "GET", "POST" ] }, { "DownstreamPathTemplate": "/orders", "DownstreamScheme": "http", "DownstreamHostAndPorts": [{ "Host": "localhost", "Port": 5002 }], "UpstreamPathTemplate": "/api/orders", "UpstreamHttpMethod": [ "GET", "POST" ] } ] }
🔹 ابزارهای کلیدی که باید اضافه بشن
- Docker: هر سرویس داخل کانتینر خودش
- RabbitMQ/Kafka: پیامرسانی بین سرویسها
- Polly: برای Retry و Circuit Breaker
- JWT Auth (IdentityServer/OpenIddict): برای امنیت و هویت
✅ نتیجه:
ما سه سرویس جدا (محصول، سفارش، مشتری) داریم که هر کدوم دیتابیس خودشون رو دارن، ارتباط بینشون از طریق HTTP/gRPC + Messaging هست و همه پشت یک API Gateway قرار گرفتن.
در معماری میکروسرویسها، هر سرویس میتواند روی یک سرور (یا حتی ماشین مجازی/کانتینر) جداگانه قرار بگیرد، اما اجباری نیست.
🔹 سناریوهای مختلف استقرار سرویسها
-
همه سرویسها روی یک سرور
-
سادهترین حالت برای شروع.
-
سرویسها جدا هستند اما روی یک سرور اجرا میشوند.
-
معایب: اگر سرور Down شود، همه سرویسها میخوابند. مقیاسپذیری هم سخت است.
-
-
هر سرویس روی سرور (VM) جداگانه
-
استقلال بیشتر بین سرویسها.
-
میشود منابع سختافزاری متفاوت برای هر سرویس داد.
-
معایب: هزینه بالاتر + مدیریت پیچیدهتر.
-
-
استقرار با کانتینر (Docker)
-
هر سرویس داخل یک کانتینر جدا (ولی میتوانند روی یک یا چند سرور اجرا شوند).
-
سبکتر از VM و قابل حمل.
-
معمولترین روش در معماری میکروسرویس.
-
-
Orchestration با Kubernetes
-
سرویسها در قالب کانتینر Deploy میشوند.
-
K8s مسئول مدیریت مقیاسپذیری، Load Balancing، Service Discovery و Fault Tolerance است.
-
سرویسها میتوانند روی چندین سرور (Node) توزیع شوند.
-
🔹 نتیجه
- در معماری میکروسرویس واقعی معمولاً سرویسها روی سرورهای جدا یا کانتینرهای مجزا اجرا میشوند.
- لزومی ندارد هر سرویس فیزیکی جدا باشد؛ میشود چند سرویس روی یک سرور هم مستقر شوند، ولی اصل ماجرا استقلال در استقرار و مقیاسپذیری است.
- بهترین روش امروز: Docker + Kubernetes.
در معماری میکروسرویس شما برای هر سرویس (مثلاً Product، Order، Customer) یک پروژه مستقل دارید.
🔹 ویژگیهای این استقلال:
-
هر پروژه Web API جداگانه است (با Startup و تنظیمات خودش).
-
هر سرویس میتواند دیتابیس مختص خودش داشته باشد.
-
سرویسها میتوانند روی سرور/کانتینرهای مختلف مستقر شوند.
-
اگر یکی از سرویسها Down شود، بقیه همچنان کار میکنند.
-
میتوانید یک سرویس خاص را بهصورت مستقل مقیاسپذیر (Scale Out) کنید.