API Gateway ile Backend for Frontend (BFF) Deseni
Mikroservis mimarilerinde, istemci uygulamaları (web, mobil, masaüstü) genellikle onlarca farklı servisle doğrudan konuşmak zorunda kalır. Bu durum, istemci tarafında karmaşıklığa, güvenlik açıklarına ve performans sorunlarına yol açar. Bu sorunu çözmek için iki güçlü desen öne çıkar: API Gateway ve Backend for Frontend (BFF). Her iki desen de istemci ile mikroservisler arasında bir ara katman oluşturur, ancak amaçları ve kapsamları farklıdır. Bu yazıda, bu iki deseni derinlemesine inceleyecek, farklarını ve birlikte nasıl kullanılacaklarını ele alacağız.
1. API Gateway Nedir?
API Gateway, tüm istemci isteklerinin tek bir giriş noktasından geçtiği bir ters vekil (reverse proxy) sunucusudur. İstemci, hangi mikroservisin hangi veriyi sağladığını bilmek zorunda değildir; sadece API Gateway'e istek gönderir.
API Gateway'in Temel Sorumlulukları:
-
Yönlendirme (Routing): Gelen isteği, URL path'ine göre doğru mikroservise iletir.
-
Yük Dengeleme (Load Balancing): Aynı servisin birden fazla instance'ı varsa, trafiği dengeli dağıtır.
-
Kimlik Doğrulama ve Yetkilendirme: JWT, API Key veya OAuth2 ile gelen istekleri doğrular.
-
Hız Sınırlama (Rate Limiting): Aşırı kullanımı önler.
-
İstek/Yanıt Dönüşümü: Header, path veya body dönüşümleri yapar.
-
Sağlık Kontrolü: Arkadaki servislerin canlı olup olmadığını izler.
-
Loglama ve İzleme: Tüm istekleri merkezi olarak loglar.
API Gateway'in Zayıf Yönü: Tüm istemciler için tek tip bir API sunar. Web, mobil ve 3. parti istemcilerin farklı ihtiyaçları (veri formatı, boyut, iş mantığı) aynı API'de karşılanmaya çalışıldığında, API şişer ve karmaşıklaşır.
2. Backend for Frontend (BFF) Nedir?
BFF, her istemci türü için ayrı bir backend katmanı oluşturmayı öneren bir desendir. Web uygulaması için ayrı bir BFF, mobil uygulama için ayrı bir BFF, hatta akıllı TV için ayrı bir BFF olabilir. Her BFF, o istemcinin ihtiyaçlarına özel olarak tasarlanır.
BFF'in Temel Sorumlulukları:
-
Veri Agregasyonu: Birden fazla mikroservisten veri toplayıp tek bir yanıtta birleştirir.
-
Veri Dönüşümü: İstemcinin ihtiyacına göre veriyi şekillendirir (DTO dönüşümü).
-
İstemciye Özel İş Mantığı: Sadece o istemciye özel iş kuralları uygular.
-
Payload Optimizasyonu: Mobil için daha küçük, web için daha zengin veri döner.
-
Protokol Dönüşümü: İstemcinin anlayacağı protokolü (REST, GraphQL, WebSocket) kullanır.
BFF'in Temel Faydası: İstemciye özel optimizasyon. Örneğin, mobil BFF sadece gerekli alanları dönerken, web BFF daha zengin veri sunabilir.
3. API Gateway vs. BFF: Temel Farklar
| Kriter | API Gateway | BFF (Backend for Frontend) |
|---|---|---|
| Amaç | Tüm istemciler için tek giriş noktası | Her istemci türü için özel backend |
| Kapsam | Geniş (tüm istemciler) | Dar (tek istemci türü) |
| Veri Dönüşümü | Sınırlı (genelde proxy) | Kapsamlı (DTO, veri birleştirme) |
| İş Mantığı | Yok (cross-cutting concern) | Var (istemciye özel mantık) |
| Ölçeklenebilirlik | Yüksek (merkezi) | İstemci sayısı kadar BFF instance'ı |
| Geliştirme Ekibi | Platform/DevOps ekibi | Frontend ekibi veya ilgili ürün ekibi |
| Konum | Genelde en dış katman | Gateway'in arkasında veya yanında |
| Kullanım Alanı | Routing, auth, rate limiting | Veri agregasyonu, format dönüşümü |
4. İki Desenin Birlikte Kullanımı (En İyi Pratik)
Modern mimarilerde, API Gateway ve BFF genellikle birlikte kullanılır. API Gateway, dış dünyaya açılan tek kapıdır ve güvenlik, routing, rate limiting gibi cross-cutting concern'leri yönetir. BFF'ler ise Gateway'in arkasında çalışır ve her istemci türü için özel veri işleme yapar.
Önerilen Mimari:
text
[Web] [Mobil] [3. Parti]
\ | /
\ | /
[API Gateway] ← Güvenlik, Routing, Rate Limiting
|
+------+------+
| | |
[Web BFF] [Mobil BFF] [Partner BFF]
| | |
+------+------+
|
[Mikroservisler]
Bu mimarinin avantajları:
-
Güvenlik Merkezileşir: Tüm kimlik doğrulama ve yetkilendirme Gateway'de yapılır.
-
İstemciye Özel Optimizasyon: Her BFF, kendi istemcisi için en uygun veriyi döner.
-
Bağımsız Evrim: Web BFF, mobil BFF'yi etkilemeden değişebilir.
-
Sorumluluk Ayrımı: Gateway altyapı ekibi, BFF'ler ürün ekipleri tarafından yönetilir.
5. .NET'te Uygulama Stratejileri
A. API Gateway: YARP (Yet Another Reverse Proxy)
YARP, Microsoft tarafından geliştirilen, yüksek performanslı ve özelleştirilebilir bir reverse proxy kütüphanesidir.
csharp
// Program.cs
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
// appsettings.json
{
"ReverseProxy": {
"Routes": {
"web-bff": {
"ClusterId": "web-bff-cluster",
"Match": { "Path": "/web/{**catch-all}" }
},
"mobile-bff": {
"ClusterId": "mobile-bff-cluster",
"Match": { "Path": "/mobile/{**catch-all}" }
}
},
"Clusters": {
"web-bff-cluster": { "Destinations": { "dest1": { "Address": "https://localhost:7001/" } } },
"mobile-bff-cluster": { "Destinations": { "dest1": { "Address": "https://localhost:7002/" } } }
}
}
}
B. BFF: ASP.NET Core Web API
Her istemci için ayrı bir ASP.NET Core Web API projesi oluşturulur. Web BFF, web istemcisinin ihtiyaçlarına; mobil BFF, mobil istemcinin ihtiyaçlarına göre tasarlanır.
csharp
// Web BFF Controller
[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;
private readonly IReviewService _reviewService;
[HttpGet]
public async Task<IActionResult> GetProducts()
{
// Birden fazla servisten veri topla
var products = await _productService.GetAllAsync();
var reviews = await _reviewService.GetLatestAsync();
// Web istemcisi için zengin veri döner
var result = products.Select(p => new ProductWebDto
{
Id = p.Id,
Name = p.Name,
Price = p.Price,
Description = p.Description,
AverageRating = reviews.Where(r => r.ProductId == p.Id).Average(r => r.Rating),
ImageUrls = p.Images
});
return Ok(result);
}
}
// Mobil BFF Controller
[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> GetProducts()
{
var products = await _productService.GetAllAsync();
// Mobil için daha hafif veri döner
var result = products.Select(p => new ProductMobileDto
{
Id = p.Id,
Name = p.Name,
Price = p.Price,
ThumbnailUrl = p.ThumbnailUrl
});
return Ok(result);
}
}
C. BFF'de GraphQL Kullanımı
GraphQL, BFF katmanında güçlü bir alternatiftir. İstemci, ihtiyaç duyduğu veriyi tek bir sorguda talep edebilir. Hot Chocolate, .NET için en popüler GraphQL sunucusudur.
csharp
public class Query
{
[UseDbContext(typeof(AppDbContext))]
public async Task<IEnumerable<ProductDto>> GetProducts(
[ScopedService] AppDbContext context,
[Service] IReviewService reviewService)
{
var products = await context.Products.ToListAsync();
// ... her ürün için rating hesapla
return products.Select(p => new ProductDto { ... });
}
}
6. Ne Zaman Hangisi?
| Senaryo | Öneri |
|---|---|
| Tek istemci (sadece web) | API Gateway yeterli olabilir |
| Birden fazla istemci (web, mobil, TV) | BFF deseni şiddetle önerilir |
| Mobil istemci için optimize edilmiş veri gerekiyorsa | BFF |
| Sadece routing, auth, rate limiting gerekiyorsa | API Gateway |
| Veri agregasyonu ve dönüşümü gerekiyorsa | BFF |
| Hem güvenlik hem istemci optimizasyonu gerekiyorsa | API Gateway + BFF birlikte |
7. En İyi Pratikler
-
Gateway'i İnce Tutun: API Gateway sadece cross-cutting concern'leri (auth, routing, rate limiting) yönetsin. İş mantığını BFF'lere bırakın.
-
Her İstemci İçin Ayrı BFF: Web, mobil ve partner istemcileri için ayrı BFF'ler oluşturun.
-
BFF'leri Ürün Ekipleri Yönetsin: Her BFF, ilgili frontend ekibi tarafından geliştirilip bakımı yapılmalıdır.
-
Ortak Kodu Paylaşın: BFF'ler arasında ortak DTO'lar ve servis çağrıları için paylaşılan bir kütüphane oluşturun.
-
Observability: Her BFF'i ayrı ayrı izleyin ve loglayın.
-
Versiyonlama: Her BFF kendi versiyonlama stratejisine sahip olabilir.
-
Hata Yönetimi: BFF'ler, mikroservis hatalarını anlamlı HTTP kodlarına dönüştürmelidir (Problem Details).
Sonuç
API Gateway ve BFF, mikroservis mimarilerinde birbirini tamamlayan iki güçlü desendir. API Gateway, tüm istemciler için güvenli, merkezi bir giriş noktası sağlarken; BFF, her istemci türü için optimize edilmiş, özel bir backend katmanı sunar. İki deseni birlikte kullanmak, hem güvenliği hem de istemci deneyimini en üst düzeye çıkarır. .NET ekosisteminde YARP (API Gateway) ve ASP.NET Core Web API / Hot Chocolate (BFF) ile bu mimariyi kolayca uygulayabilirsiniz. Unutmayın: Doğru katmanı doğru iş için kullanmak, ölçeklenebilir ve sürdürülebilir bir API mimarisinin anahtarıdır.