API Gateway ile Backend for Frontend (BFF) Deseni
Mikroservis mimarisinde istemciler (web, mobil, partner) onlarca servisle doğrudan konuşmak zorunda kaldığında; karmaşıklık, güvenlik açıkları ve performans sorunları kaçınılmaz hale gelir. Bu sorunu çözmek için iki desen öne çıkar: API Gateway ve Backend for Frontend (BFF). Her ikisi de istemci ile servisler arasında bir katman oluşturur; ancak amaçları ve kapsamları farklıdır.
1. API Gateway Nedir?
API Gateway, tüm istemci isteklerinin geçtiği tek giriş noktasıdır. İstemci, hangi mikroservisin hangi veriyi sağladığını bilmez; yalnızca Gateway'e istek gönderir.
Temel Sorumluluklar:
-
Routing: İsteği URL path'ine göre doğru servise yönlendirme.
-
Kimlik Doğrulama ve Yetkilendirme: JWT, API Key, OAuth2 doğrulaması.
-
Rate Limiting: Aşırı kullanımı engelleme.
-
Yük Dengeleme: Servis instance'ları arasında trafik dağıtımı.
-
Loglama ve İzleme: Merkezi gözlemlenebilirlik.
Zayıf Yönü: Tüm istemcilere aynı API'yi sunar. Web, mobil ve partner istemcilerinin farklı veri ihtiyaçları (boyut, format, iş mantığı) tek bir API'de karşılanmaya çalışıldığında API şişer.
2. Backend for Frontend (BFF) Nedir?
BFF, her istemci türü için ayrı bir backend katmanı oluşturmayı önerir. Web uygulaması için ayrı BFF, mobil için ayrı BFF olabilir.
Temel Sorumluluklar:
-
Veri Agregasyonu: Birden fazla servisten veri toplayıp tek yanıtta birleştirme.
-
Veri Dönüşümü: İstemcinin ihtiyacına göre DTO şekillendirme.
-
Payload Optimizasyonu: Mobil için daha küçük, web için daha zengin veri.
-
İstemciye Özel İş Mantığı: Sadece o istemciye özgü kurallar.
Temel Faydası: İstemciye özel optimizasyon. Mobil BFF yalnızca gerekli alanları dönerken, web BFF daha zengin veri sunabilir.
3. Temel Farklar
| Kriter | API Gateway | BFF |
|---|---|---|
| Kapsam | Tüm istemciler | Tek istemci türü |
| Amaç | Güvenlik, routing, rate limiting | Veri agregasyonu, dönüşüm |
| İş Mantığı | Yok (cross-cutting) | Var (istemciye özel) |
| Konum | En dış katman | Gateway'in arkasında |
| Sahibi | Platform/DevOps ekibi | Frontend/ürün ekibi |
4. Birlikte Kullanım: En İyi Pratik
Modern mimarilerde ikisi birlikte kullanılır:
text
[Web] [Mobil] [Partner]
\ | /
\ | /
[API Gateway] ← Güvenlik, routing, rate limiting
|
+------+------+
| | |
[Web BFF] [Mobil BFF] [Partner BFF] ← Veri agregasyonu, dönüşüm
| | |
+------+------+
|
[Mikroservisler]
Avantajları:
-
Güvenlik merkezileşir (Gateway).
-
İstemciye özel optimizasyon sağlanır (BFF).
-
BFF'ler bağımsız evrilir.
-
Sorumluluklar net ayrılır.
5. .NET'te Uygulama
A. API Gateway: YARP
YARP, Microsoft'un yüksek performanslı reverse proxy kütüphanesidir.
csharp
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
app.MapReverseProxy();
json
{
"ReverseProxy": {
"Routes": {
"web": { "ClusterId": "web-bff", "Match": { "Path": "/web/{**catch-all}" } },
"mobile": { "ClusterId": "mobile-bff", "Match": { "Path": "/mobile/{**catch-all}" } }
},
"Clusters": {
"web-bff": { "Destinations": { "d1": { "Address": "https://localhost:7001/" } } },
"mobile-bff": { "Destinations": { "d1": { "Address": "https://localhost:7002/" } } }
}
}
}
B. BFF: ASP.NET Core Web API
Her istemci için ayrı bir API projesi oluşturulur.
csharp
// Web BFF
[HttpGet]
public async Task<IActionResult> GetProducts()
{
var products = await _productService.GetAllAsync();
var reviews = await _reviewService.GetLatestAsync();
// Web için zengin veri
return Ok(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)
}));
}
// Mobil BFF
[HttpGet]
public async Task<IActionResult> GetProducts()
{
var products = await _productService.GetAllAsync();
// Mobil için hafif veri
return Ok(products.Select(p => new ProductMobileDto
{
Id = p.Id, Name = p.Name, Price = p.Price, ThumbnailUrl = p.ThumbnailUrl
}));
}
C. BFF'de GraphQL Alternatifi
GraphQL, BFF katmanında güçlü bir alternatiftir; istemci ihtiyaç duyduğu veriyi tek sorguda alır. Hot Chocolate, .NET için olgun bir GraphQL sunucusudur.
6. Ne Zaman Hangisi?
| Senaryo | Öneri |
|---|---|
| Tek istemci (sadece web) | API Gateway yeterli |
| Birden fazla istemci (web, mobil, TV) | BFF şiddetle önerilir |
| Sadece routing, auth, rate limiting | API Gateway |
| Veri agregasyonu ve dönüşümü | BFF |
| Hem güvenlik hem istemci optimizasyonu | İkisi birlikte |
7. En İyi Pratikler
| Pratik | Açıklama |
|---|---|
| Gateway'i ince tutun | Sadece cross-cutting endişeler; iş mantığı BFF'te. |
| Her istemci için ayrı BFF | Web, mobil, partner için ayrı katmanlar. |
| BFF'leri ürün ekipleri yönetsin | İlgili frontend ekibi sahibi olmalı. |
| Ortak kodu paylaşın | BFF'ler arasında DTO ve servis çağrıları için ortak kütüphane. |
| Her BFF'i ayrı izleyin | Observability katmanında ayrı metrikler. |
Sonuç
API Gateway ve BFF, 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ş bir backend katmanı sunar. İkisini birlikte kullanmak, hem güvenliği hem de istemci deneyimini en üst düzeye çıkarır. .NET ekosisteminde YARP (Gateway) ve ASP.NET Core Web API / Hot Chocolate (BFF) ile bu mimari kolayca uygulanır. Unutmayın: Doğru katmanı doğru iş için kullanmak, ölçeklenebilir ve sürdürülebilir bir API mimarisinin anahtarıdır.