Api Gateway

Microservices Design Pattern - Api Gateway Yaklaşımı

Cengiz Bursalıoğlu
3 min readNov 13, 2018

Merhaba arkadaşlar,

Bugün sizlere Microservices Design Pattern’lerinin en popülerlerinden olan api-gateway pattern’ine genel bir bakış açısı kazandırmaya çalışacağım.

Öncelikle mikroservise yapısından kısaca bahsedelim; Mikroservise yapısı sürekli ve plansız bir şekilde büyüyen monolithic yapıdaki servislerin, beraberinde getirdiği karmaşıklığı ve yönetim zorluklarını çözmeye odaklanmaktadır. Peki bize ne gibi avantajlar sunar;

  • Maintenance kolay olur ve code base sadeleşir.
  • Birbirlerinden bağımsız olarak her bir servis değiştirilebilir, kolay test ve build yapılabilir.
  • Servisler birbirinden bağımsız olarak scale edilebilir.
  • Versiyonlama yönetimi kolaylaşır.
  • Her bir mikroservise farklı dilde ve farklı framework’lerde geliştirilebilir.

Yukarıdaki resimde api-gateway yaklaşımı hakında kafamızda bir şeyler canlanmaktadır. Kullanıcı uygulamadan bir request attığında arkada neler dönüyor bunu bilmez. Api-gateway bu requeste cevap verebilmek için içerde belki de onlarca mikroservise gidip geliyor olabilir. İşte tam burada datanın nasıl fetch ve aggregate edileceği konusunda api-gateway pattern’i bizim neye ihtiyacımız olduğunu çözmek için var.

GET http://order_service/orders/1
{
id: 1,
description: "This is the order’s description",
customerId: 95,
lines: [
{ description: "item 1", price: 3.5 },
{ description: "item 2", price: 2 }
],
total: 5.5
}

Yukarıdaki şekilde http call ile sipariş hakkında bilgi alabileceğimiz bir mikroservis olsun. Bu servis customer’in id’si dışında customer ile ilgili hiçbir bilgi bilmemektedir.

GET http://customer_service/customers/95
{
id: 95,
name: "Cengiz Bursalıoğlu",
email: "cengiz.bursalioglu@gmail.com"
}

Yukarıdaki servisimiz ise customer mikroservisimiz olsun. Bu servis de görüldüğü üzere id ye göre customer bilgilerini dönmektedir.

GET http://api/orders/1
{
id: 1,
description: "This is the order’s description",
customer: {
id: 95,
name: "Cengiz Bursalıoğlu",
email: "cengiz.bursalioglu@gmail.com" },
lines: [
{ description: "item 1", price: 3.5 },
{ description: "item 2", price: 2 }
],
total: 5.5
}

Bir müşteri bir sipariş hakkında bilgi istediğinde, başka bir ek talepte bulunmaya zorlamak yerine müşteri bilgilerini de içine gömmek istiyoruz. Bu durumda dataları servislerden alma, aggregate etme ve müşteriye yukarıdaki şekilde sunma mantığını api-gateway katmanında yapmalıyız.

Api Consumer, response’u oluşturmak için içerde 2 tane istek yapıldığını bilmez. Hangi servislere istek atılacağı sadece gateway kontrolündedir. Bu şeffaflık api-gateway pattern’inin temel mantığıdır.

Api-Gateway temel davranışları;

  • Router: Mikroservisler arasında haberleşmeyi sağlar. Bir servisten diğerine gelen istekleri iletir(Service Discovery).
  • Data aggregator: Mikroservisler arasında bilgi toplayarak ve bunları zengin bir response halinde bağlı olduğu Api Consumer’a iletir. Bu durumda Backend For Frontend (BFF) gibi davranmış olur.
  • Protocol abstraction layer: Api-gateway’e Rest Api veya GraphQL üzerinden gelen isteklerle yani protocol ve teknoloji farketmeksizin içerdeki mikroservislerin iletişimini sağlar.
  • Centralized error management: Bir servise ulaşılamadığı zaman veya servis aşırı yavaş cevap vermeye başladığı zaman api-gateway ölümcül hataların yayılmaması için cache den default response’lar sağlamaya başlar. Sistemi daha güvenilir ve esnek hale getirmek için erişelemeyen servis yeniden ayağa kalkana kadar kapatılır(Circuit Breaker).

Api Gateway Design Pattern’i hakkında bilgiler vermeye çalıştım. Daha fazlasını öğrenmek için aşağıdaki adresleri kullanabilirsiniz.

https://microservices.io/patterns/apigateway.html https://www.nginx.com/blog/building-microservices-using-an-api-gateway/

--

--