Mikroservis Mimarisinde API Gateway: Karmaşayı Yönetmenin Anahtarı
Umut Özdemir
Mikroservis Mimarisinde API Gateway: Karmaşayı Yönetmenin Anahtarı
Monolitik yapılardan mikroservislere geçiş, ölçeklenebilirlik sağlasa da beraberinde yönetim zorluklarını getirir. Bu yazıda, istemci ve servisler arasındaki trafiği merkezi bir noktadan yönetmemizi sağlayan API Gateway desenini ve .NET ekosistemindeki çözümleri inceliyoruz.
Yazılım dünyasında "büyük ve tek parça" (Monolith) yapılardan, bağımsız ve küçük servislere (Microservices) geçiş artık bir standart haline geldi. Ancak servis sayısı arttıkça, bu servislerin dış dünyaya nasıl açılacağı, güvenlik (Auth), hız sınırlama (Rate Limiting) ve yönlendirme gibi süreçlerin her serviste ayrı ayrı nasıl yönetileceği büyük bir soru işaretine dönüşür.
İşte tam bu noktada API Gateway devreye girer.
API Gateway Nedir?
API Gateway, istemciler (Mobil, Web, IoT) ile mikroservisler arasında duran bir giriş kapısıdır. İstemci, arka planda hangi servisin hangi IP'de çalıştığını bilmek zorunda kalmadan tek bir noktaya istek atar; Gateway bu isteği karşılar, doğrular ve ilgili servise yönlendirir.
Neden Kullanmalıyız?
-
Merkezi Güvenlik: Kimlik doğrulama (JWT vb.) işlemlerini her serviste ayrı ayrı yapmak yerine Gateway üzerinde bir kez yaparsınız.
-
Yük Dengeleme (Load Balancing): Gelen trafiği servislerin farklı instance'larına dengeli bir şekilde dağıtır.
-
Protokol Dönüştürme: Dışarıya REST API sunarken, içeride servisler arası iletişimde gRPC veya mesaj kuyruklarını (RabbitMQ) kullanabilirsiniz.
-
Hız Sınırlama (Rate Limiting): API'nizin suistimal edilmesini önlemek için kullanıcı başına istek sınırı koyabilirsiniz.
.NET Dünyasında API Gateway Çözümleri
Eğer .NET ekosisteminde bir çözüm mimarisi kurguluyorsanız, önünüzde iki güçlü seçenek var:
-
Ocelot: Uzun süredir standart kabul edilen, konfigürasyon bazlı ve oldukça esnek bir kütüphane.
-
YARP (Yet Another Reverse Proxy): Microsoft tarafından geliştirilen, yüksek performanslı ve özelleştirilebilir bir reverse proxy kütüphanesi. Özellikle yüksek trafikli projelerde YARP, .NET 8 ile birlikte harikalar yaratıyor.
Sonuç
Clean Architecture prensiplerine sadık kalarak kurguladığınız bir projede, mikroservislerin karmaşasını dış dünyadan saklamak ve güvenliği tek merkezden yönetmek sürdürülebilir bir sistemin temelidir. Karmaşık sistemleri basitleştirmek, iyi bir mimarın en büyük imzasıdır.
Bölüm 2: Örnek Uygulama Rehberi (Case Study)
Bu rehberde, yukarıdaki şemada gördüğünüz yapının basitleştirilmiş bir versiyonunu kodlayacağız. İki mikroservisimiz ve bir API Gateway'imiz olacak.
Senaryo:
-
ProductService: Basit bir ürün listesi döner. -
UserService: Basit bir kullanıcı listesi döner. -
ApiGateway: YARP kullanarak gelen istekleri bu servislere yönlendirir.
Gereksinimler:
-
.NET 8 SDK
-
Visual Studio veya VS Code
Adım 1: Proje Yapısını Oluşturmak
Önce bir çözüm (solution) ve projeleri oluşturalım:
# Çözüm klasörü
mkdir MyGatewayDemo
cd MyGatewayDemo
# Çözüm dosyası
dotnet new sln -n MyGatewayDemo
# 1. Product Mikroservis (ASP.NET Core Empty API)
dotnet new webapi -n MyGatewayDemo.ProductService
dotnet sln add MyGatewayDemo.ProductService
# 2. User Mikroservis (ASP.NET Core Empty API)
dotnet new webapi -n MyGatewayDemo.UserService
dotnet sln add MyGatewayDemo.UserService
# 3. API Gateway (ASP.NET Core Web App)
dotnet new web -n MyGatewayDemo.Gateway
dotnet sln add MyGatewayDemo.Gateway
Adım 2: Mikroservisleri Hazırlamak
Bu adımda, iki mikroservisimizi de basitleştirilmiş veri dönecek şekilde düzenleyelim.
2a. ProductService (MyGatewayDemo.ProductService)
Program.cs dosyasını şu şekilde güncelleyin:
// MyGatewayDemo.ProductService/Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Basit bir endpoint
app.MapGet("/api/products", () =>
new[] {
new { Id = 1, Name = "Laptop", Price = 15000 },
new { Id = 2, Name = "Mouse", Price = 250 }
});
app.Run();
2b. UserService (MyGatewayDemo.UserService)
Program.cs dosyasını şu şekilde güncelleyin:
// MyGatewayDemo.UserService/Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Basit bir endpoint
app.MapGet("/api/users", () =>
new[] {
new { Id = 101, Name = "Umut Özdemir", Email = "umut@info" },
new { Id = 102, Name = "Ahmet Yılmaz", Email = "ahmet@mail" }
});
app.Run();
Önemli: Servislerin hangi portlarda çalışacağını belirleyin.
properties/launchSettings.jsondosyalarından kontrol edin (örneğin Product: 5001, User: 5002).
Adım 3: API Gateway Projesini Yapılandırmak
Şimdi, YARP kütüphanesini API Gateway projesine ekleyelim ve yönlendirme (routing) ayarlarını yapalım.
3a. YARP Kütüphanesini Ekleme
API Gateway projesi klasörüne gidin:
cd MyGatewayDemo.Gateway
dotnet add package Yarp.ReverseProxy
3b. Gateway Konfigürasyonu (appsettings.json)
appsettings.json dosyasını açın ve YARP'ın hangi isteği nereye yönlendireceğini (ReverseProxy sekmesi altında) tanımlayın:
// MyGatewayDemo.Gateway/appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
// YARP KONFİGÜRASYONU BAŞLIYOR
"ReverseProxy": {
"Routes": {
"product_route": {
"ClusterId": "product_cluster",
"Match": {
"Path": "/products/{**catch-all}" // Bu patika gelirse...
}
},
"user_route": {
"ClusterId": "user_cluster",
"Match": {
"Path": "/users/{**catch-all}" // Bu patika gelirse...
}
}
},
"Clusters": {
"product_cluster": {
"Destinations": {
"destination1": {
"Address": "https://localhost:5001/api/" // Buraya yönlendir
}
}
},
"user_cluster": {
"Destinations": {
"destination1": {
"Address": "https://localhost:5002/api/" // Buraya yönlendir
}
}
}
}
}
}
3c. Gateway Program.cs
Program.cs dosyasını YARP'ı kullanacak şekilde güncelleyin:
// MyGatewayDemo.Gateway/Program.cs
var builder = WebApplication.CreateBuilder(args);
// appsettings.json'daki ReverseProxy konfigürasyonunu yükle
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.UseRouting();
// YARP Middleware'ini kullan
app.MapReverseProxy();
app.Run();
Adım 4: Uygulamayı Test Etmek
Tüm projeleri aynı anda başlatın (Visual Studio'da "Multiple Startup Projects" seçeneği ile).
-
Uygulamalarınızın çalıştığından emin olun.
-
Tarayıcınızı açın.
Test Sonuçları:
-
Doğrudan Mikroservis:
https://localhost:5001/api/products(Ürünleri döner - Gateway olmadan) -
Gateway Üzerinden:
https://localhost:5000/products/products-
İstemci 5000 (Gateway) portuna istek atıyor.
-
Gateway,
productspatikasını görüyor. -
Konfigürasyondaki
product_cluster'a yönlendiriyor. -
Sonuç olarak
https://localhost:5001/api/products'dan gelen veriyi istemciye iletiyor.
-
Bu rehberle, .NET 8 ve YARP kullanarak modern bir API Gateway'in temellerini atmış olduk. Bu yapıyı daha sonra şemadaki gibi kimlik doğrulama, hız sınırlama veya daha karmaşık yük dengeleme kuralları ekleyerek genişletebiliriz.
Daha Fazla Insight İster Misiniz?
Yazılım mimarileri ve dijital stratejiler üzerine en yeni yazılarımdan haberdar olun.