Dotnet üzerinden API Gateway ve Mikro Servis Mimarisine uygun proje yapımı

Merhaba, bu yazımda iki tane mikroservis yazacağız ve bunları da Api Gateway ile yöneteceğiz.

Api Gateway Nedir?

Api gateway, backend servisleriniz ile client arasında yer alan bir api yönetim aracıdır.

Api Gateway Ne Yapar?

Api gateway Client’dan gelen api çağrılarını alır ve uygun mikroservislere yönlendirir.

Örnek bir proje yapımı

Visual studio ortamında iki tane microservis yazıp bunları da api gateway ile yönlendirmelerini yapacağız.

Blank solution olarak projemizi açıp içine services klasörü ile bir ApiGateway .net 5.0 api projesi ekliyoruz.

Services klasörüne BookService ve UserService olmak üzere iki tane proje ekliyoruz bu servisler birbirinden tamamen bağımsız şekilde olacak biri kitaplar hakkında bize bilgiler verecek diğer servis de kullanıcılar hakkında kayıtlar döndürecek.
Bu servisler kendi içinde Domain Driven Design mimarisine uygun şekilde olacak.

Projemizin mimarisi artık hazır diyebiliriz. Kitap bilgilerini döndürecek BookService‘ine BookController ekleyelim bu controller altına da Get Actionu ekleyelim parametre olarak da isbn alsın Book\Get?isbn=”” ile bize kitabın bilgisi dönecek projemizin ana odağından kaçmama adına database eklemeden statik olarak bu verileri döndüreceğiz.

Book.Domain ve Book.Infasctructure katmanlarına services adında bir klasör oluşturalım domain tarafındaki oluşturduğumuz klasöre IBookService interface’i Infastructure katmanına da BookService class’ını ekleleyelim.

DTOS klasör altındaki BookDTO Modelimiz:

IBookService

BookService :

Servisimizi yazdık şimdi middleware’da (startup.cs) bunları bağlayalım

BookController:

Book.API projesini startup as project yapıp api/book?isbn=test şeklinde bir url ile verilerimizin döndüğünü görebiliriz. Böylece kitap servimizi şimdilik tamamlanmış oluyoruz.

User servisimizde kitap servisindeki aynı mantıkla geliştireceğiz.Bu servisde kullanıcının username‘i parametremiz olacak.

Bu bölüm kitap servisinin neredeyse aynısı olduğu için sadece UserController ve IUserService’i göstereceğim

UserController:

IUserService:

IUserService’i startup.cs’de bağlamayı ve projelerin referansını vermeyi unutmayınız. Bu işlemlerde bittikten sonra projemizi startup project yapıp api/user?username=okan şeklinde bir url ile testimizi yaptığımızda başarılı olduğunu görüyoruz. Servislerimiz bu noktada bitiyor şimdi gateway oluşturma kısmına geçelim.

Api Gateway

Öncelikle api gateway neden gerekli neden ihtiyaç duyuyoruz ona değinelim. Yaptığımız iki servis farklı portlarda belki de farklı makinelerde ayağa kalkacaktır. Client tarafında bu bilgileri beraber çağırma ihtiyacımız olabilir her sefereinde farklı portlara bağlanıp bunları birleştirmek servis sayısı arttıkça bu işlemi zorlaştıracaktır bunun yerine bütün servislerimizi tek noktadan yöneterek client tarafında aynı portla ile yönlendirmelerimizi sağlayabiliriz bunun dışında bu iki servisin bir authorize işlemi olabilir, her servisi yeniden authorize yapmak yerine gateway ile bu güvenli bir şekilde yapılabilir.

ApiGateway projemize açık kaynak kodlu Ocelot paketinden faydalanacağız nuget üzerinden yükleyelim.
Resmi dokümantasyonu takip edebiliriz link

Paketi yükledikten sonra APIGateway’in ana dizinine apiSettings.json adında bir configuration dosyası ekleyelim. Bu dosyada servislerimizin tanımlarını yapacağız.
Aşağıdaki şekilde json dosyamızı düzenliyoruz.

Routes adında dizi tipinde bir nesnemiz var. Bu dizine servislerimizi kaydettik. Servisleri https protokolü üzerinden yayınladıkları ortları yazdık sizde kendi portlarınız yazınız. Downstream, bağlandığımız servisin bilgileri, Upstream ise gateway üzerinden çağırdığımız yani aslında kullandığımız port üzerinde hangi adresle tetikleneceğini belirledik.

Solution’ın properties’lerine girip startup project olarak apilerimizi ve gatewayi seçiyoruz.

Projemizi çalıştırıp belirlediğimiz url’ler ile dönen cevapları kontrol edelim.

Proje dosyalarına aşağıdaki linkten erişebilirsiniz.

Proje linki : https://github.com/okankrdg/ApiGatewayExample

You may also like...

2 Responses

  1. abdullah dedi ki:

    Hocam Selamlar,
    Book servisinde okan kitap aldı diye bir tabloda kitap ve kullanıcı Id lerini tutuyor diyelim.
    Ve işlemler binlerce satırı buldu.
    Book ve User ayrı Db’lerde diye düşünelim.
    Şimdi datayı çoklayarak Book’ta user tablosu oluşturabilirim. Ya da sadece Id lerini tutarak BFF tarzı bir işlem yapabilirim.
    Şimdi BFF yaptığımızı düşünelim Apigetaway’de yalnız yüz bin satır kitap ve yüz bin satır user datasını nasıl birleştirebiliriz.
    Teşekkürler

    • Okan Karadağ dedi ki:

      Merhaba,
      apiSetting.json dosyasında Routes gibi Aggregates adında bir dizi tanımlamalısınız,
      ör: "Aggregates": [
      {
      "RouteKeys": [
      "user",
      "book"
      ],
      "Aggregator": "UserBookAggregator",
      "UpstreamPathTemplate": "/bookwithuser/{id}"
      }
      ]
      , daha sonra yazılan UserBookAggregator’ü IDefinedAggregator’dan miras alarak yeni bir response dönderebilirsiniz. Daha fazla detay için resmi doküman da yardımcı olabilir

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Turkish