API Gateway Nedir
API Gateway Nedir
Web API tarafında isteklerin karşılanması için birçok controller sınıfı kendilerine ait olan portlar ile işlemler yapmaktadır. Request ilgili port üzerinden ilgili API servisine yönlendirilerek işlemler gerçekleşir. Bu yapının daha esnek olması ve tek elden yönetilebilmesi açısından API Gateway işlemine ihtiyaç duyulmuştur. API Gateway, gelen tüm requestleri alarak bunların gerekli API servislerine yönlendirmesini gerçekleştirmektedir. Böylelikle tek bir port üzerinden tüm API servislerini kullanmak mümkün olur.
Ocelot Nedir
Ocelot, API Gateway kütüphanesi olup micreservis odaklı mimariler üzerinde gelen requestlerin istenen API servislerine yönlendirmesini ve geriye response olarak döndürülmesini sağlamaktadır.
Ocelot Projelerde Nasıl Kullanılır?
Ocelot kütüphanesini projelerde kullanmak için örnek bir senaryoya yer verdim. Rider üzerinden OcelotGateway adında boş bir Web API projesi oluşturarak işleme başladım. Sonrasında solution kısmından üzerine Ocelot kütüphanesini eklemem gereken ‘Gateway’ ve üzerinde çalışacağım, istek atacağım ‘ProductAPI’ proje dosyalarını uygulamama ekledim.
Görüldüğü üzere OcelotGateway solution altında Gateway ve ProductAPI olmak üzere 2 tane proje dosyam mevcut.
Senaryomda ProductAPI tarafında Product class’ı oluşturarak ProductId ve ProductName fieldlarını tutmak ve static bir class içerisinde değerler atamak. Projede veri tabanı kullanmadan bir statik liste üzerinde çalışma yapacağım. API testlerini ise Swagger ve Postman tarafında eş zamanlı olarak gerçekleştireceğim.
Proje tarafında ilk olarak port ayarlarını gerçekleştirerek başlamak istedim. Bunun için Gateway ve ProductAPI tarafında “launchSetting.json” dosyalarında gerekli düzenlemelerimi gerçekleştirdim.
Gateway dosyasında https portunu 5000 olarak belirledim. (http portu üzerinden çalışmayacağım için http portunu değiştirmeye gerek duymadım. Ancak siz http portu üzerinden çalışmak isterseniz o kısmı da değiştirebilirsiniz.)
Şimdi sırada ProductAPI tarafındaki port ayarlarını yapmaya geldi.
ProductAPI tarafında yine ‘launchSetting.json’ dosyasında ProductAPI için https üzerinden 5001 portunu ayarladım. ProductAPI servisi 5001 portu üzerinden çalışacak. Ben projede örnek olması için sadece ProductAPI adında bir projeye yer verdim. Başka API projeleri olsaydı onlara da farklı port adresleri verecektim. (Örneğin 5002, 5003,.. gibi)
Port ayarlarını yaptıktan sonra Gateway olarak oluşturduğum projeye Ocelot kütüphanesini kurmam gerekiyor.
Ocelot kütüphanesini sadece Gateway üzerine yükledim. Projeyi swagger üzerinden test edeceğim için Swashbuckle.AspNetCore kütüphanesi de projede yüklü. Ancak Gateway tarafında swaggera ihtiyacım olmadığı için Gateway projemden sildim, sadece ProductAPI üzerinde çalıştırmaya izin verdim.
Bu işlemlerin ardından ProductAPI tarafındaki controller işlemlerini ve static liste tanımlamalarını gerçekleştirdim.
ProductAPI controller dosyası içerisinde ProductController.cs adında bir class dosyası oluşturarak içerisinde Product adında harici bir class’a daha yer verdim. Burada ProductId ve ProductName field alanlarını oluşturarak static bir liste içerisinde ilk değer ataması gerçekleştirdim. Static liste oluşturmamın amacı ise projeyi swagger ve postman tarafında test ederken static liste üzerinde, çalışma anında, değişiklikleri kontrol etmek.
Class ve static liste tanımlamalarının ardından POST, PUT, DELETE, GET, GET {id} işlemlerini gerçekleştirdim.
Gerekli CRUD işlemlerini de yaparak ProductAPI tarafındaki işlemlerimi bitirdim.
Bu işlemlerin ardından Gateway tarafında ocelot.json adında bir json dosyası oluşturarak gerekli yönlendirmeleri ve controller tarafında yer verdiğim HttpPost, HttpGet, HttpPut alanlarının url tanımlamalarını gerçekleştirdim.
Gerekli port, method ve url ayarlamalarını ocelot.json dosyası içerisinde tanımladım.
ProductAPI üzerinde çalışma gerçekleştireceğim için ProductAPI için tanımladığım 5001 portunu bu tarafta da tanımladım. Localhost host’u üzerinden çalışacağımı ve controller tarafında tanımladığım tüm Get, Post, Put parametrelerini de bu tarafta gösterdim.
En altta yer alan GlobalConfiguration ise API Gateway adresini tutmaktadır. BaseUrl tarafında localhost:5000 üzerinden istekleri atacağımı ve arka planda ProductAPI tarafında işlemlerin gerçekleştirileceğini gösterdim. (Yani projeyi test ederken 5000 üzerinden istek atıp aslında arka planda 5001 üzerinden işlem yapacağımı bildirdim.) Eğer başka API projem olsaydı o projede tanımlayacağım port adresini ve CRUD işlemleri için url yapılarını da bu kısımda tanımlamak zorundaydım.
Ocelot.json dosyasını oluşturduktan sonra Ocelot’u sisteme tanıtmam için Program.cs tarafında gerekli ayarlamaları yapmam gerek. Ben .Net Core 6 versiyonunda çalıştığım için startup.cs dosyasına ihtiyaç duymadan tüm tanımalamalarımı program.cs üzerinde gerçekleştireceğim.
Gateway projesindeki Program.cs içerisinde Ocelot tanımlamalarını gerçekleştirdim. Ocelot.json dosyasını da yine bu tarafta gösterdim.
Bu işlem ile birlikte artık projeyi ayağa kaldırabilirim. 2 farklı proje dosyam olduğu için arka planda tek tek çalıştırmak yerine Compound yaparak iki projenin (Gateway ve ProductAPI) aynı anda çalışmasını sağlamam gerekiyor.
Run/Edit Configuration içerisinde gerekli ayarlamaları yaparak ilk önce Gateway, ikinci olarak ise ProductAPI projesinin tek bir elden çalışmasını sağlamak istedim.
Projeyi çalıştırıdğımda localhost:5000 ve localhost:5001 adresleri arka planda birlikte çalıştı. Swagger sadece ProductAPI üzerinde kurulduğu için ise ProductAPI’nin çalıştığı port üzerinde Controller tarafında oluşturduğum tüm işlemlerin geldiğini görüyorum. Şimdi sıra geldi test etmeye.
API Gateway Test Ortamı
Static liste olarak tanımladığım list içerisindeki verilerimi swagger ve postman tarafında eş zamanlı olarak testini hem 5000 hem de 5001 portları üzerinden gerçekleştireceğim.
Swagger üzerinde tüm verileri GET olarak tanımladığım HttpGet isteğiyle getirdim. Listemdeki 3 ürüne ait olan ProductId ve ProductName alanları geldi. Dikkat ettiyseniz işlem 5001 portu üzerinden geldi. Ancak ben bunu istemiyorum. API Gateway kurmamın amacı Gateway tarafındaki 5000 portu üzerinden API isteklerine gitmemdi.
Bu işlemi ise 5000 portu olarak Postman üzerinde deneyeceğim.
Postman tarafında 5000 portu üzerinden işlemi gerçekleştirdiğimde yine aynı verilere ulaştığımı görüyorum. 5000 portu üzerinden arka planda istek 5001 üzerinden çağrılmaktadır. 5001’e ihtiyaç duymadan isteklerin aslında 5001 üzerinden gelmesini sağlıyorum.
Testlere id’e göre veri getirme, ekleme, güncelleme ve silme işlemleriyle devam edelim.
Swagger üzerinde 5001 portu üzerinden sadece 2 id numarasılı ürüne ait bilgilerin geldiğini görüyorum. Bunu postman tarafında 5000 portu üzerinden denediğimde ise aşağıdaki sonucu alıyorum.
Görüldüğü üzere Postman tarafında 5000 portu üzerinden id numarası 2 olan ürüne ait bilgiler getirilmektedir.
Swagger tarafında yeni bir ürün ekleme işlemini gerçekleştirdim. Eş zamanlı olarak Postman tarafında tüm ürünlerin getirilmesini test edip eklediğim son ürünün gelmesini görmek istiyorum.
Postman üzerinde 5000 portu ile GET fonksiyonu ile verileri listelediğimde, Swagger tarafında eklediğim son verinin de yine liste içerisinde yer aldığını görüyorum.
Swagger tarafta PUT fonksiyonunu kullanarak id değeri 1 olan ürünün ismini “Monster Notebook” değiştim ve Postman tarafında 1 numaralı ürüne ait bilgiyi getirmek istiyorum.
Postman üzerinden sadece 1 numaralı id değerine ait olan ürünün bilgileri, güncel haliyle, geldi.
Son olarak ise swagger üzerinden delete fonksiyonunu çalıştırarak id değeri 3 olan ürünü silmek istedim. Postman tarafında ürün listesini getirip içerisinde id değeri 3 olan kaydın olmamasını görmek istiyorum.
Görüldüğü üzere Postman tarafında tüm ürünlerin listesi içerisinde 3 numaralı ürün yer almamaktadır.
Swagger ve Postman üzerinden testlerin Get, Get {id}, Post, Put ve Delete için sorunsuz çalıştığını gördük. Burada en temel amacımız API Gateway tarafında tanımladığımız 5000 portu üzerinden arkada yer alan API isteklerine ulaşmaktı.
API Gateway ve Ocelot kütüphanesini kullanarak projedeki bu amacı gerçekleştirdik. Böylelikle istekler tek bir elden yönetilecek olup tek bir port üzerinden diğer API isteklerine ulaşmak mümkün olacaktır.
Testleri gerçekleştirirken swagger üzerinden ekleme, silme, güncelleme işlemlerini yaptım, postman tarafında da bunlar gerçekleştirilip swagger tarafta son güncel verilerin getirilmesi eş zamanlı olarak sağlanabilir.
Projeye ve yararlandığım kaynaklara ilişkin bilgiler aşağıdaki gibidir. Farklı projelerde ve yazılarda görüşmek üzere 😊
Projeyi yazdığım IDE: Rider, Web API
Kullandığım Versiyon: .NET 6
Programlama Dili: C#, .Net Core
Kullandığım Kütüphaneler: Ocelot, Swashbuckle.AspNetCore
Yararlandığım Kaynaklar: https://www.gencayyildiz.com/blog/
Proje Github Linki: https://github.com/Yuemwrite/OcelotGateway