Gereksinimler ve Ön Hazırlık
Başarılı bir uygulama için geliştirme ortamınızın güncel olması şarttır. 2026 standartlarında bir proje için aşağıdaki araçların yüklü olduğundan emin olun:
- .NET 9 SDK veya üzeri.
- Visual Studio 2022 (v17.12+) veya Visual Studio Code (C# Dev Kit ile).
- Docker Desktop (konteynerleştirme testleri için).
- Temel düzeyde HTTP protokolü ve ASP.NET Core bilgisi.
Projenizi başlatmak için terminalinizde şu komutu kullanarak boş bir ASP.NET Core Web API projesi oluşturun:
dotnet new web -n ApiGatewayProjesi
cd ApiGatewayProjesi
Bu komut, en hafif yapı olan "minimal API" şablonunu oluşturur. Gateway servisleri genellikle ağır iş mantığı içermediği için bu hafif yapı oldukça performanslıdır.
Ocelot Kütüphanesinin Kurulumu ve Yapılandırılması
Ocelot, .NET dünyasında API Gateway denildiğinde akla gelen ilk ve en kararlı kütüphanedir. İstekleri yönlendirme, kimlik doğrulama ve hız sınırlama (rate limiting) gibi işlemleri kolaylaştırır.
Öncelikle Ocelot paketini projenize ekleyin:
dotnet add package Ocelot
Paket yüklendikten sonra, gateway'in yönlendirme kurallarını belirleyeceğimiz ocelot.json dosyasını projenin ana dizinine oluşturun. Bu dosya, istemciden gelen isteklerin hangi mikroservise iletileceğini tanımlar.
{
"Routes": [
{
"DownstreamPathTemplate": "/api/products/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{ "Host": "localhost", "Port": 5001 }
],
"UpstreamPathTemplate": "/gateway/products/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ]
}
]
}
Burada Upstream istemcinin gördüğü, Downstream ise mikroservisin gerçek adresidir.
Program.cs Dosyasında Gateway Entegrasyonu
Ocelot'u uygulamanıza dahil etmek için Program.cs dosyasını yapılandırmanız gerekir. Bu adım, gateway'in ayağa kalkması için en kritik aşamadır.
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
// Ocelot yapılandırmasını JSON dosyasından yükle
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
var app = builder.Build();
// Ocelot middleware'ini çalıştır
await app.UseOcelot();
app.Run();
Bu kod bloğu, gelen her isteğin Ocelot tarafından yakalanıp ocelot.json kurallarına göre yönlendirilmesini sağlar.
API Gateway Kullanım Yöntemleri ve Karşılaştırma
Mikroservis mimarisinde API Gateway kurarken farklı yaklaşımlar mevcuttur. Aşağıdaki tablo, yaygın tercihleri özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Ocelot (Kod Tabanlı) | Esnek, .NET ile tam uyumlu | Manuel bakım gerektirir |
| YARP (Reverse Proxy) | Microsoft destekli, yüksek performans | Daha düşük seviyeli yapılandırma |
| Cloud Gateway (Azure/AWS) | Yönetim kolaylığı | Maliyetli ve bağımlılık |
Güvenlik: Kimlik Doğrulama ve Yetkilendirme
API Gateway, mikroservislerinizin dış dünyaya açılan kapısıdır. Bu nedenle, tüm isteklerin doğrulanması gerekir. JWT (JSON Web Token) kullanarak güvenliği sağlayabilirsiniz.
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options => {
options.Authority = "https://identity-server.com";
options.Audience = "api-gateway";
});
Bu yapılandırma, gateway'e gelen token'ın geçerli olup olmadığını kontrol eder. Geçersiz token ile gelen istekler mikroservise ulaşmadan reddedilir.
Dikkat: Üretim ortamında (production) asla HTTP kullanmayın. Tüm yönlendirmeler HTTPS üzerinden yapılmalı ve API anahtarları (API Keys) veya JWT tokenları güvenli bir şekilde saklanmalıdır. Gizli bilgileri asla kaynak kod içerisinde (hard-coded) bırakmayın; bunun yerine Azure Key Vault veya Environment Variables kullanın.
Hız Sınırlama (Rate Limiting) ile Servis Koruması
Bir mikroservisin çökmesini engellemek için gateway üzerinde hız sınırlama uygulamak en iyi pratiklerden biridir. ocelot.json dosyanıza şu bloğu ekleyerek bir kullanıcının saniyede kaç istek atabileceğini sınırlayabilirsiniz:
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 5
}
Bu ayar, bir istemcinin aynı endpoint'e saniyede en fazla 5 istek atmasına izin verir. Bu, DDoS saldırılarını önlemek ve servis kaynaklarını korumak için hayati önem taşır.
Sıkça Sorulan Sorular
API Gateway tek bir hata noktası (single point of failure) değil mi?
Evet, gateway çökerse tüm sistem durabilir. Bu yüzden gateway'i birden fazla örnek (instance) olarak ayağa kaldırmalı ve önünde bir Load Balancer kullanmalısınız.
YARP mi yoksa Ocelot mu seçmeliyim?
Eğer çok yüksek trafikli bir proxy ihtiyacınız varsa YARP, daha fazla özellik (auth, rate limiting, caching) ve kolay konfigürasyon istiyorsanız Ocelot tercih edilmelidir.
Gateway üzerinde iş mantığı (business logic) yazmalı mıyım?
Hayır, API Gateway sadece bir yönlendiricidir. İş mantığınızı mikroservisler içerisinde tutmanız, sistemin modülerliğini korumak için şarttır.
Mikroservisler arası iletişim gateway üzerinden mi olmalı?
Hayır, mikroservisler kendi aralarında doğrudan veya bir Message Broker (RabbitMQ, Kafka) üzerinden haberleşmelidir. Gateway sadece dış dünyadan gelen istekler içindir.
Loglama nasıl yapılmalı?
Gateway üzerinde merkezi bir loglama (Serilog, ELK Stack) kullanarak tüm giren-çıkan trafiği izlemeli ve hata oranlarını takip etmelisiniz.
API Gateway Performans Optimizasyonu ve Önbellekleme Stratejileri
Mikroservis mimarisinde API Gateway, tüm trafiğin geçtiği bir darboğaz (bottleneck) potansiyeli taşır. Bu nedenle, gateway üzerinden geçen isteklerin yanıt sürelerini optimize etmek, sistemin genel kullanıcı deneyimi için kritiktir. Ocelot içerisinde yerleşik olarak gelen önbellekleme (caching) mekanizması, sık tekrarlanan isteklerin mikroservislere gitmeden doğrudan gateway üzerinden yanıtlanmasını sağlar.
Önbellekleme yapılandırması için Ocelot.Cache.CacheManager kütüphanesini projenize eklemeniz gerekmektedir. Aşağıdaki yapılandırma, belirli bir rotaya gelen istekleri 60 saniye boyunca bellekte tutar:
// ocelot.json yapılandırması
{
"Routes": [
{
"DownstreamPathTemplate": "/api/products/{id}",
"UpstreamPathTemplate": "/gateway/products/{id}",
"UpstreamHttpMethod": [ "Get" ],
"FileCacheOptions": {
"TtlSeconds": 60,
"Region": "productCache"
}
}
]
}
Bu yapılandırma ile, aynı ürün detayına yapılan ardışık istekler ilk seferde mikroservise giderken, sonraki 60 saniye boyunca gateway tarafından hızlıca servis edilir. Bu durum, arka plandaki mikroservislerin yükünü ciddi oranda azaltır.
Gateway Üzerinde Hata Ayıklama ve İzlenebilirlik (Observability)
Dağıtık sistemlerde bir isteğin hangi aşamada başarısız olduğunu tespit etmek oldukça zordur. API Gateway, tüm trafiğin merkezi olduğu için hata ayıklama (debugging) süreçlerinin merkezi haline getirilmelidir. Ocelot üzerinde "Correlation ID" kullanımı, isteğin gateway'e girdiği andan mikroservise ulaştığı ana kadar izlenmesini sağlar.
İstekleri izlemek için bir DelegatingHandler oluşturarak her isteğe benzersiz bir ID atayabilirsiniz:
public class CorrelationIdHandler : DelegatingHandler
{
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!request.Headers.Contains("X-Correlation-ID"))
{
request.Headers.Add("X-Correlation-ID", Guid.NewGuid().ToString());
}
return await base.SendAsync(request, cancellationToken);
}
}
Bu handler'ı Program.cs içerisinde Ocelot'a şu şekilde kaydedebilirsiniz:
builder.Services.AddOcelot()
.AddDelegatingHandler();
Bu yöntem sayesinde, mikroservislerinizde oluşan logları X-Correlation-ID üzerinden filtreleyerek, isteğin tüm yaşam döngüsünü (gateway -> servis -> veritabanı) saniyeler içinde analiz edebilirsiniz. Özellikle 500 Internal Server Error gibi durumlarda, hatanın hangi servisten kaynaklandığını bulmak için bu pratik vazgeçilmezdir.
İleri Düzey İpuçları
- Header Dönüşümü: Mikroservislerinizden gelen hassas bilgileri (örneğin
ServerveyaX-Powered-Byheader'ları) gizlemek içinUpstreamHeaderTransformözelliklerini kullanın. - Servis Keşfi (Service Discovery): Consul veya Eureka gibi araçlarla entegre olarak, mikroservislerinizin IP adresleri değiştiğinde gateway'in bunu otomatik algılamasını sağlayın.
- Yük Dengeleme (Load Balancing): Ocelot içerisinde
LoadBalancerOptionskullanarakRoundRobinveyaLeastConnectionalgoritmalarıyla trafiği birden fazla servis örneğine dağıtın.
Sonuç
C# ile API Gateway oluşturmak, mikroservis mimarinizin güvenliğini ve yönetilebilirliğini bir üst seviyeye taşır. Ocelot gibi güçlü araçlar sayesinde, karmaşık yönlendirme ve güvenlik kurallarını temiz bir kod yapısıyla yönetebilirsiniz. Bu rehberde öğrendiğiniz temel yapılandırmaları, projenizin ihtiyaçlarına göre özelleştirebilirsiniz.
Güvenlik Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızın güvenlik açıklarından (SQL Injection, XSS, yetkisiz erişim vb.) geliştirici sorumludur. Üretim ortamına almadan önce mutlaka profesyonel bir sızma testi yaptırın.
Bir sonraki adım olarak, gateway üzerinde "Caching" (önbellekleme) mekanizmasını nasıl kuracağınızı araştırmanızı ve mikroservislerinizde "Circuit Breaker" (devre kesici) desenini uygulayarak sistem dayanıklılığını artırmanızı öneririm.

Yorumlar (0)
Yorum Yaz