Mikroservis Mimarisi & API Tasarımı 3 dk okuma 7 okunma

API Gateway ile Backend for Frontend (BFF) Deseni

API Gateway, tüm istemciler için tek giriş noktası sunar; routing, kimlik doğrulama ve rate limiting gibi yatay endişeleri merkezileştirir. BFF ise her istemci türü (web, mobil) için özel bir backend katmanı oluşturarak veri agregasyonu ve dönüşümü yapar. İkisi birlikte kullanıldığında güvenlik merkezi, istemci deneyimi ise optimize edilmiş olur.

API Gateway ile Backend for Frontend (BFF) Deseni

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.

Tüm yazılar Soru ya da yorumun mu var? Yaz