API Gateway Mimarisi: YARP ve Ocelot ile Mikroservislerin Tek Giriş Noktası
Mikroservis mimarisinde, her servisin ayrı bir IP/port üzerinden çalışması, istemci uygulamalarının (web, mobil) birden fazla endpoint'i bilmesini ve yönetmesini zorlaştırır. Ayrıca her serviste ayrı ayrı kimlik doğrulama (authentication), yetkilendirme (authorization), hız sınırlama (rate limiting) ve loglama yapmak bakım kabusuna dönüşür.
API Gateway (API Ağ Geçidi), tüm bu karmaşıklığı tek bir noktada toplayan bir ters vekil (reverse proxy) sunucusudur. Tüm istemci istekleri önce bu gateway'e gelir, o da isteği ilgili mikroservise yönlendirir (route), güvenlik politikalarını uygular ve yanıtı istemciye geri iletir. .NET ekosisteminde bu iş için iki ana seçenek öne çıkar: Microsoft'un geliştirdiği YARP (Yet Another Reverse Proxy) ve uzun süredir kullanılan Ocelot.
1. API Gateway'in Temel Sorumlulukları
-
Yönlendirme (Routing): Gelen isteği, URL path'ine göre doğru mikroservise yönlendirir.
-
Yük Dengeleme (Load Balancing): Birden fazla instance'ı olan servislere trafiği dağıtır (Round Robin, Random, Least Requests vb.).
-
Kimlik Doğrulama ve Yetkilendirme (Authentication & Authorization): JWT, OAuth veya API Key ile gelen istekleri doğrular ve yetkilendirir.
-
Hız Sınırlama (Rate Limiting): Belirli bir istemcinin veya IP adresinin belirli bir sürede yapabileceği istek sayısını sınırlayarak servisleri kötüye kullanıma karşı korur.
-
İstek/Yanıt Dönüşümleri (Request/Response Transformation): İstemciden gelen isteğin header'larını, path'ini veya body'sini değiştirip servise iletmek; servisten gelen yanıtı da benzer şekilde dönüştürmek.
-
Sağlık Kontrolü (Health Checks): Arkadaki servislerin canlı olup olmadığını kontrol eder ve sağlıksız servislere trafik göndermez.
2. YARP (Yet Another Reverse Proxy)
YARP, Microsoft tarafından geliştirilen ve .NET Core üzerine inşa edilmiş, yüksek performanslı ve son derece özelleştirilebilir bir ters vekil kütüphanesidir. Bir "kutudan çıkmış ürün" olmaktan çok, kendi API Gateway'inizi inşa etmek için kullanacağınız bir yapı taşıdır (building block).
-
Performans: YARP, .NET'in en yeni performans optimizasyonlarından yararlanır. Yapılan testlerde, YARP'in Ocelot'a göre saniyede yaklaşık %50 daha fazla istek işleyebildiği gözlemlenmiştir.
-
Esneklik ve Özelleştirme: Bir ASP.NET Core middleware'i olarak çalıştığı için, tüm .NET ekosistemine hakimsinizdir. İhtiyacınız olan her türlü özel davranışı (custom authentication, logging, transformation) kolayca entegre edebilirsiniz.
-
Modern Protokol Desteği: HTTP/2, HTTP/3, gRPC ve WebSocket gibi güncel protokolleri uçtan uca (end-to-end) destekler.
-
Gelişmiş Yük Dengeleme: Random, Power of Two Choices, Least Requests ve First Healthy gibi çeşitli algoritmalar sunar.
-
Servis Keşfi (Service Discovery): Consul gibi servis keşif araçlarıyla entegre edilebilir.
YARP ile API Gateway Kurulumu:
-
Yeni bir ASP.NET Core Web API projesi oluşturun.
-
NuGet paketini ekleyin:
dotnet add package Yarp.ReverseProxy -
Program.csdosyasında YARP'i yapılandırın:
csharp
var builder = WebApplication.CreateBuilder(args);
// YARP servislerini ekle
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); // appsettings.json'dan yükle
var app = builder.Build();
// YARP middleware'ini ekle (tüm istekleri proxy'le)
app.MapReverseProxy();
app.Run();
-
appsettings.jsondosyasında rotaları ve hedef kümeleri (clusters) tanımlayın:
json
{
"ReverseProxy": {
"Routes": {
"order-route": {
"ClusterId": "order-cluster",
"Match": {
"Path": "/orders/{**catch-all}" // /orders ile başlayan istekleri yakala
}
},
"product-route": {
"ClusterId": "product-cluster",
"Match": {
"Path": "/products/{**catch-all}"
}
}
},
"Clusters": {
"order-cluster": {
"Destinations": {
"dest1": {
"Address": "https://localhost:7001/" // Order mikroservisinin adresi
}
}
},
"product-cluster": {
"Destinations": {
"dest1": {
"Address": "https://localhost:7002/"
}
}
}
}
}
}
Bu konfigürasyon, /orders/... path'ine gelen istekleri https://localhost:7001/ adresine, /products/... path'ine gelenleri ise https://localhost:7002/ adresine yönlendirecektir. YARP ile rate limiting eklemek için, .NET'in yerleşik RateLimiter middleware'ini kullanabilirsiniz.
3. Ocelot
Ocelot, .NET ekosisteminde uzun yıllardır kullanılan, olgun ve zengin özelliklere sahip bir API Gateway'dir. YARP'ın aksine, daha çok konfigürasyon odaklı bir yaklaşım sunar ve birçok özelliği "kutudan çıkmış" olarak sağlar.
-
Kullanım Kolaylığı: JSON konfigürasyon dosyası (
ocelot.json) üzerinden tüm routing, authentication, rate limiting ayarlarını yapabilirsiniz. -
Zengin Özellik Seti: Routing, request aggregation, load balancing, authentication (JWT), authorization, rate limiting, caching, QoS (Polly ile retry/circuit breaker) gibi birçok özelliği hazır olarak sunar.
-
Dinamik Konfigürasyon: Çalışma zamanında (runtime) konfigürasyonu değiştirmek için bir yönetim API'si sunar.
Ocelot ile API Gateway Kurulumu:
-
Yeni bir ASP.NET Core Web API projesi oluşturun.
-
NuGet paketini ekleyin:
dotnet add package Ocelot -
Program.csdosyasında Ocelot'u yapılandırın:
csharp
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
// Ocelot konfigürasyonunu yükle
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
var app = builder.Build();
// Ocelot middleware'ini ekle
await app.UseOcelot();
app.Run();
-
ocelot.jsondosyasında rotaları tanımlayın:
json
{
"Routes": [
{
"DownstreamPathTemplate": "/api/orders/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 7001
}
],
"UpstreamPathTemplate": "/orders/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
},
{
"DownstreamPathTemplate": "/api/products/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 7002
}
],
"UpstreamPathTemplate": "/products/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000" // Gateway'in kendi adresi
}
}
Bu konfigürasyon, /orders ile başlayan istekleri localhost:7001/api/orders'e, /products ile başlayanları ise localhost:7002/api/products'a yönlendirecektir.
4. YARP vs Ocelot: Ne Zaman Hangisi?
| Özellik | YARP | Ocelot |
|---|---|---|
| Performans | Çok Yüksek (~%50 daha hızlı) | Yüksek (YARP'a göre daha düşük) |
| Esneklik / Özelleştirme | Çok Yüksek (ASP.NET Core middleware) | Orta (Konfigürasyon tabanlı) |
| Kullanım Kolaylığı | Orta (Kod/konfigürasyon karışımı) | Yüksek (JSON konfigürasyonu) |
| Protokol Desteği | HTTP/1, HTTP/2, HTTP/3, gRPC, WebSocket | Ağırlıklı HTTP, gRPC/WebSocket zayıf |
| Kutudan Çıkan Özellikler | Routing, LB, Health Check | Routing, LB, Auth, Rate Limit, Cache, QoS |
| Geliştirici | Microsoft (.NET Ekibi) | Topluluk (ThreeMammals) |
| En İyi Olduğu Senaryo | Yüksek performans, özel ihtiyaçlar, modern protokoller | Hızlı başlangıç, standart ihtiyaçlar, konfigürasyon ağırlıklı |
Özetle:
-
YARP, performansın kritik olduğu, özelleştirme ihtiyacının yüksek olduğu ve gRPC/WebSocket gibi modern protokollerin kullanıldığı projeler için idealdir.
-
Ocelot, hızlıca bir API Gateway kurmak isteyen, standart HTTP/REST servisleri olan ve konfigürasyon odaklı çalışmayı seven ekipler için daha uygundur.
Her iki araç da mikroservis mimarisinde API Gateway ihtiyacını karşılayabilir. Seçim, projenizin özel gereksinimlerine (performans, esneklik, ekip tecrübesi) bağlıdır.