وقتی وارد دنیای معماری میکروسرویس (Microservices Architecture) میشوی، اولین چیزی که باهاش دستوپنجه نرم میکنی، مسئلهی ارتباط بین سرویسهاست. تصور کن دهها سرویس مجزا داری که هر کدام روی پورت و آدرس جداگانهای اجرا میشن. کلاینتها (مرورگر، اپ موبایل و…) باید با کدوم سرویس صحبت کنن؟ اینجاست که API Gateway وارد ماجرا میشه.
API Gateway یک نقطهی ورودی واحد (Single Entry Point) برای تمام درخواستهای کلاینتهاست. به زبان ساده، یه دربان هوشمند که:
Ocelot یک کتابخانهی متنباز (Open Source) برای پیادهسازی API Gateway در اکوسیستم .NET و C# است. این ابزار توسط جامعهی بزرگ داتنت توسعه یافته و بهخاطر سادگی، انعطاف و قدرت بالایش، بین برنامهنویسان ایرانی و خارجی محبوبیت زیادی پیدا کرده.
مهمترین ویژگیهای Ocelot عبارتند از:
قبل از اینکه شروع کنیم، مطمئن شو که موارد زیر را داری:
فرض کن میخوایم یک سیستم ساده با دو میکروسرویس بسازیم:
با دستورات زیر سه پروژه جداگانه میسازیم:
dotnet new webapi -n ProductService dotnet new webapi -n OrderService dotnet new webapi -n ApiGateway
وارد پروژهی ApiGateway شو و پکیج Ocelot را نصب کن:
cd ApiGateway dotnet add package Ocelot
اگر میخوای از قابلیتهای پیشرفتهتر مثل Service Discovery با Consul استفاده کنی:
dotnet add package Ocelot.Provider.Consul dotnet add package Ocelot.Cache.CacheManager
قلب تپندهی Ocelot، فایل ocelot.json است. این فایل را در ریشهی پروژه ApiGateway بساز:
{
“Routes”: [
{
“DownstreamPathTemplate”: “/api/products/{everything}”,
“DownstreamScheme”: “https”,
“DownstreamHostAndPorts”: [
{
“Host”: “localhost”,
“Port”: 5001
}
],
“UpstreamPathTemplate”: “/products/{everything}”,
“UpstreamHttpMethod”: [ “GET”, “POST”, “PUT”, “DELETE” ]
},
{
“DownstreamPathTemplate”: “/api/orders/{everything}”,
“DownstreamScheme”: “https”,
“DownstreamHostAndPorts”: [
{
“Host”: “localhost”,
“Port”: 5002
}
],
“UpstreamPathTemplate”: “/orders/{everything}”,
“UpstreamHttpMethod”: [ “GET”, “POST”, “PUT”, “DELETE” ]
}
],
“GlobalConfiguration”: {
“BaseUrl”: “https://localhost:5000”
}
}
درک ساختار این فایل بسیار مهم است:
حالا باید Ocelot را به برنامه معرفی کنیم. فایل Program.cs را به این شکل تنظیم کن:
using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder = WebApplication.CreateBuilder(args); // اضافه کردن فایل پیکربندی Ocelot builder.Configuration.AddJsonFile(“ocelot.json”, optional: false, reloadOnChange: true); // ثبت سرویسهای Ocelot builder.Services.AddOcelot(builder.Configuration); var app = builder.Build(); // استفاده از Middleware ی Ocelot await app.UseOcelot(); app.Run();
یکی از قدرتمندترین ویژگیهای Ocelot، Load Balancing داخلی آن است. فرض کن سرویس محصولات روی سه سرور اجرا میشه:
{
“DownstreamPathTemplate”: “/api/products/{everything}”,
“DownstreamScheme”: “https”,
“DownstreamHostAndPorts”: [
{ “Host”: “localhost”, “Port”: 5001 },
{ “Host”: “localhost”, “Port”: 5003 },
{ “Host”: “localhost”, “Port”: 5005 }
],
“LoadBalancerOptions”: {
“Type”: “RoundRobin”
},
“UpstreamPathTemplate”: “/products/{everything}”,
“UpstreamHttpMethod”: [ “GET”, “POST” ]
}
Ocelot از سه الگوریتم Load Balancing پشتیبانی میکند:
Rate Limiting از سوءاستفاده از API جلوگیری میکند. با Ocelot بهراحتی تنظیم میشه:
{
“UpstreamPathTemplate”: “/products/{everything}”,
“RateLimitOptions”: {
“ClientWhitelist”: [],
“EnableRateLimiting”: true,
“Period”: “1s”,
“PeriodTimespan”: 1,
“Limit”: 10
}
}
این تنظیمات یعنی: هر کلاینت در هر ثانیه حداکثر 10 درخواست میتواند ارسال کند.
یکی از متداولترین نیازها در پروژههای واقعی، احراز هویت با JWT در لایه Gateway است. ابتدا پکیج مورد نیاز را نصب کن:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
سپس در Program.cs احراز هویت را اضافه کن:
builder.Services.AddAuthentication(“Bearer”)
.AddJwtBearer(“Bearer”, options =>
{
options.Authority = “https://your-identity-server”;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
builder.Services.AddOcelot(builder.Configuration);
و در ocelot.json مشخص کن کدام Route نیاز به احراز هویت دارد:
{
“UpstreamPathTemplate”: “/orders/{everything}”,
“AuthenticationOptions”: {
“AuthenticationProviderKey”: “Bearer”,
“AllowedScopes”: []
}
}
برای بهبود پرفورمنس، میتونی پاسخها را کش کنی. ابتدا پکیج را نصب کن:
dotnet add package Ocelot.Cache.CacheManager
و در Program.cs:
builder.Services.AddOcelot(builder.Configuration) .AddCacheManager(x => x.WithDictionaryHandle());
و در ocelot.json:
{
“UpstreamPathTemplate”: “/products/{everything}”,
“FileCacheOptions”: {
“TtlSeconds”: 30,
“Region”: “products-region”
}
}
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. سئو یک سرمایهگذاری مطمئن برای رشد کسبوکار شماست، نه یک هزینه!
📞 همین حالا برای مشاوره رایگان با ما تماس بگیرید:
09190994063 — 09376846692
بازار ابزارهای API Gateway شلوغه. بیایید Ocelot را با رقبا مقایسه کنیم:
یکی از ویژگیهای جالب Ocelot، قابلیت Request Aggregation است؛ یعنی یک درخواست کلاینت را به چند سرویس میفرستد و جوابها را ترکیب میکند:
{
“Aggregates”: [
{
“RouteKeys”: [ “ProductRoute”, “OrderRoute” ],
“UpstreamPathTemplate”: “/dashboard”
}
],
“Routes”: [
{
“UpstreamPathTemplate”: “/products”,
“Key”: “ProductRoute”,
…
},
{
“UpstreamPathTemplate”: “/orders”,
“Key”: “OrderRoute”,
…
}
]
}
در دنیای واقعی، API Gateway را با Docker مستقر میکنیم. فایل Dockerfile برای پروژه ApiGateway:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 5000 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY [“ApiGateway.csproj”, “.”] RUN dotnet restore COPY . . RUN dotnet build -c Release -o /app/build FROM build AS publish RUN dotnet publish -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT [“dotnet”, “ApiGateway.dll”]
💡 نکته مهم برای تیمهای ایرانی: اگر پروژهات روی زیرساخت ابری ایرانی (مثل آروانکلاد یا لیارا) هست، Ocelot بدون هیچ مشکلی روی این پلتفرمها هم کار میکنه و نیازی به تغییرات اضافه نداری.
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. با یک تماس ساده، مسیر رشد کسبوکارت را شروع کن!
📞 مشاوره رایگان: 09190994063 — 09376846692
Ocelot یکی از بهترین انتخابها برای پیادهسازی API Gateway در اکوسیستم .NET است. با ترکیب سادگی پیکربندی، قابلیتهای غنی مثل Rate Limiting، Load Balancing، Caching و JWT Authentication، و پشتیبانی قوی جامعه متنباز، این ابزار میتواند نیاز اکثر پروژههای میکروسرویس را برطرف کند.
برای پروژههای کوچک تا متوسط، Ocelot گزینهی ایدهآلی است. اگر پروژهات در حال رشد سریع است و به عملکرد بالاتری نیاز داری، بررسی YARP (پروژه Microsoft) هم توصیه میشه.
Ocelot برای پروژههای متوسط تا بزرگ مناسب است. اما اگر ترافیک بسیار بالایی دارید (میلیونها درخواست در روز)، بهتر است YARP یا ابزارهای سطح Enterprise مثل Kong را بررسی کنید. برای اکثر استارتاپها و پروژههای ایرانی، Ocelot کاملاً کافی است.
Nginx یک Reverse Proxy در لایهی شبکه است و با فایلهای config کار میکند. Ocelot یک API Gateway در لایه Application است که با کد .NET پیادهسازی میشود، امکان نوشتن Middleware سفارشی دارد، و با اکوسیستم .NET (مثل Dependency Injection) کاملاً یکپارچه است.
بله! Ocelot از JWT Bearer Authentication پشتیبانی کامل دارد و میتوان آن را با هر Identity Provider که توکن JWT صادر میکند (مثل IdentityServer4، Keycloak، Auth0 و…) ترکیب کرد. این یکی از رایجترین معماریها در پروژههای میکروسرویس است.
Ocelot از Consul و Eureka برای Service Discovery پشتیبانی میکند. با نصب پکیج Ocelot.Provider.Consul و تنظیم مناسب، میتوانید آدرس سرویسها را بهصورت داینامیک از Consul دریافت کنید. در محیط Kubernetes هم میتوان از DNS داخلی k8s بهعنوان روش سادهتری استفاده کرد.
Ocelot از WebSocket بهصورت محدود پشتیبانی میکند. برای gRPC، پیشنهاد میشود از YARP یا Envoy استفاده شود چون این ابزارها پشتیبانی بهتری از پروتکل HTTP/2 که پایهی gRPC است دارند. اما برای REST API های معمولی، Ocelot کاملاً مناسب است.
برای محیط Production توصیه میشود: ۱) Caching را فعال کنید. ۲) Rate Limiting مناسب تنظیم کنید. ۳) Circuit Breaker با Polly پیادهسازی کنید. ۴) Logging دقیق با Correlation ID داشته باشید. ۵) Health Check endpoint اضافه کنید. ۶) Timeout های مناسب در QoSOptions تنظیم کنید.
در مورد Health Check در Ocelot. آیا خود Ocelot قابلیتی برای مانیتورینگ Health سرویسهای Downstream داره یا باید جداگانه پیادهسازی بشه؟
Ocelot به صورت مستقیم Health Check داخلی برای سرویسهای Downstream ندارد، اما میتوانید با استفاده از کتابخانههایی مانند HealthChecks.UI در کنار Ocelot، وضعیت سرویسها را مانیتور کنید. برای سئو و رشد کسبوکار خود نیز با ما در ارتباط باشید: 09190994063 – 09376846692
ممنون از توضیحات عالی. پیادهسازی Rate Limiting و Caching خیلی راحت به نظر میاد. آیا تنظیمات پیشفرض برای Caching در Ocelot مناسبه یا باید بهینه بشه؟
تنظیمات پیشفرض Caching در Ocelot معمولاً برای شروع مناسب است، اما برای بهینهسازی در محیط Production توصیه میشود TTL و Region را با توجه به نیازهای پروژه خود تنظیم کنید. مشاوره رایگان: 09190994063 – 09376846692
سلام. با خطای 404 بعد از Route مواجه شدم. مطمئن هستم DownstreamPathTemplate درسته. مشکل از چی میتونه باشه؟
سلام. علاوه بر DownstreamPathTemplate، لطفاً UpstreamPathTemplate، UpstreamHttpMethod و همچنین پورت و آدرس سرویس مقصد (DownstreamHostAndPorts) را به دقت بررسی کنید. ترتیب میانافزارها در Program.cs هم مهم است. برای رفع مشکل میتوانید با ما تماس بگیرید: 09190994063 – 09376846692
تفاوت Ocelot با AWS API Gateway برای پروژههای Cloud-native چیه؟ آیا Ocelot قابلیتهای مشابهی داره؟
AWS API Gateway برای محیط Cloud-native AWS یکپارچهتر و قدرتمندتر است، اما Ocelot یک راهکار Self-hosted و رایگان است که قابلیتهای مشابهی را برای پروژههای .NET فراهم میکند. انتخاب بستگی به زیرساخت و نیازهای شما دارد. برای مشاوره تماس بگیرید: 09190994063 – 09376846692
سوال من اینه که آیا Ocelot برای پروژههای با ترافیک خیلی بالا و میلیونی هم مناسبه یا باید به فکر YARP باشیم؟
درود بر شما. Ocelot برای اکثر پروژههای متوسط تا بزرگ کافی است، اما برای ترافیک میلیونی و بسیار بالا، بررسی YARP یا Kong توصیه میشود. برای جزئیات بیشتر تماس بگیرید: 09190994063 – 09376846692
واقعاً کامل بود. یک سوال در مورد استقرار در داکر: آیا باید هر سه سرویس (ProductService, OrderService, ApiGateway) را در یک Docker Compose تعریف کنیم یا جداگانه؟
بهتر است هر سه سرویس را در یک فایل Docker Compose تعریف کنید تا مدیریت شبکهبندی و بالا آوردن همزمان آنها راحتتر باشد. برای راهنمایی در پیادهسازی با داکر با ما تماس بگیرید: 09190994063 – 09376846692
مطالب بسیار کاربردی و توضیحات قدم به قدم عالی بود. برای پروژههایی که روی زیرساخت ابری ایرانی هستند، استفاده از Ocelot مشکلی ایجاد نمیکنه؟
خوشحالیم که مورد توجه شما قرار گرفته. همانطور که در متن اشاره شد، Ocelot بدون هیچ مشکلی روی زیرساختهای ابری ایرانی (مثل آروانکلاد یا لیارا) کار میکند. برای سئو سایتتان نیز میتوانید با ما تماس بگیرید: 09190994063 – 09376846692
میشه در مورد استفاده از Correlation ID برای ردیابی درخواستها در Ocelot بیشتر توضیح بدید؟ چطور باید این رو پیادهسازی کرد؟
Correlation ID معمولاً توسط یک Middleware در API Gateway تولید و به هدر درخواستها اضافه میشود تا در کل زنجیره میکروسرویسها ردیابی شوند. میتوانید یک Middleware سفارشی برای این کار بنویسید. برای سئو سایت خود نیز با ما تماس بگیرید: 09190994063 – 09376846692
ممنون بابت آموزش جامع و کامل. واقعاً نیاز داشتم که API Gateway و Ocelot رو به صورت عملی یاد بگیرم. تفاوتش با Nginx هم خیلی واضح توضیح داده شده بود.
خواهش میکنیم. خوشحالیم که آموزش مفید واقع شده است. برای مشاوره بیشتر میتوانید با شمارههای 09190994063 و 09376846692 تماس بگیرید.
Ocelot واقعاً ابزار قدرتمندی برای .NET هست. سوالی که برام پیش اومد اینه که آیا میشه پیکربندی ocelot.json رو از دیتابیس یا سرویسهای پیکربندی مثل Consul/Vault لود کرد؟
بله، Ocelot قابلیت لود کردن پیکربندی از منابع مختلف از جمله Consul (با استفاده از پکیج Ocelot.Provider.Consul) را دارد. این روش برای محیطهای پویا و میکروسرویسها بسیار کاربردی است. برای کسب اطلاعات بیشتر تماس بگیرید: 09190994063 – 09376846692
با سلام. در بخش احراز هویت با JWT، 'https://your-identity-server' رو چطور باید مقداردهی کنیم؟ منظور از Identity Server دقیقاً چیه؟
سلام. 'your-identity-server' آدرس سرور احراز هویت شماست که توکن JWT را صادر میکند؛ میتواند IdentityServer4، Keycloak، Auth0 یا هر سرویس مشابه دیگری باشد. برای راهنمایی بیشتر تماس بگیرید: 09190994063 – 09376846692
قابلیت Request Aggregation در Ocelot خیلی جالب و کاربردیه. آیا نمونههای پیچیدهتری از Aggregation هم میشه پیادهسازی کرد؟ مثلاً ترکیب اطلاعات از چندین سرویس و تغییر فرمت خروجی؟
بله، Ocelot امکان Aggregation را فراهم میکند. برای سناریوهای پیچیدهتر که نیاز به تغییر فرمت پاسخ دارید، ممکن است نیاز به نوشتن یک Middleware سفارشی داشته باشید. برای مشاوره تخصصی تماس بگیرید: 09190994063 – 09376846692