Emre Kızıldaş
Published in

Emre Kızıldaş

Ocelot ile API Gateway Üzerinde Caching Yapısı — .NET 5.0 & Redis

Merhaba, bu yazımda sizlerle .NET 5.0 altyapısında, Ocelot paketi kullanılarak hazırlanan bir API ‘ın Redis sunucusunda nasıl cache sakladığını anlatan bir projeden bahsedeceğim.

Photo by Ridwan Meah on Unsplash

API Gateway Neler İçeriyor?

Projemizde yer alan API Gateway basit olarak routing (yönlendirme) ve caching mekanizmalarını içermektedir.

Projemizi standart API teması seçerek Visual Studio üzerinde oluşturabiliriz. Projemiz kabaca şehirlere ait hava durumu verilerini 1 dakikalık cache süresince tutacak şekilde ayarlanmış bir API içermektedir.

Projemiz içerisinde kullanacağımız NuGET paketleri şu şekildedir:

  • Ocelot: Bir API Gateway çözümüdür. İçerisinde routing, caching, rate limiting vb. bir çok özelliği barındırır. Detaylı bilgiye buradan ulaşabilirsiniz.
  • Ocelot.Cache.CacheManager: Ocelot paketi içerisinde Caching mekanizmasını kullanmak istersek yüklemek zorunda olduğumuz pakettir. API Gateway’in cachelemeyi hangi provider üzerinde yapmasını istersek bu paket aracılığıyla belirteceğiz.
  • CacheManager.StackExchange.Redis: Redis yapısını Ocelot üzerinde kullanabilmek için gereken pakettir. Bu paket sonrasında Redis için ayrı bir paket kurmamıza gerek kalmamaktadır.
  • CacheManager.Serialization.Json: Redis üzerinde verileri JSON serialize ederek tutmamızı sağlayacak olan pakettir.

API Gateway Yapılandırması

Proje içerisine yeni bir JSON dosyası ekleyelim ve ismini “ocelot.json” yapalım. Bu yapılandırma dosyası Ocelot API Gateway çözümünün bel kemiğidir. API ‘ya gelen istekler burada belirtilen parametreler doğrultusunda bir takım middleware (ara katman) geçerek -gerekiyorsa- projemize ulaşır.

Ardından dosyamızın içerisini aşağıdaki gibi şekillendirelim:

ocelot.json Dosyası

Burada kullanılan parametleri kısaca şu şekilde özetleyebiliriz:

  • Routes: Projemiz için belirlediğimiz adreslere kullanıcı istek attığında arka planda hangi API ‘ya gideceğini ayarladığımız konfigürasyondur.
  • Downstream: Aslında burada kastettiğim “downstream” ile başlayan tüm ayarlardır. Bu ayarlar projemizde yer alan API ‘lere ait olan yönlendirmelerdir.
  • Upstream: Upstream ayarları ise kullanıcıların istekte bulunacağı adresleri ve istek tipini belirtmektedir.
  • FileCacheOptions: Cache servisi konfigürasyonunu burada yapmaktayız. TtlSecons cache süresini, Region ise cache anahtarını (key) ayarlamaktadır.
  • GlobalConfiguration: Son olarak da API Gateway’in ayağa kalkınca kullanacağı ana adresi burada ayarlamaktayız.

Projemizdeki bu ocelot.json dosyasını açıklamak gerekirse; http://localhost:5000/weather/{id} adresine istekte bulunan bir client arkaplanda http://localhost:5000/api/weather/getforecast/{id} adresine yönlendirilmektedir. (Burada mikro servis mimarisi kullanarak farklı host adreslerine de yönlendirme yapılabilirdi. Sade ve anlaşılır olması açısından API Gateway ve Hava Durumu servislerini aynı proje içerisinde kullandım.) Ardından aynı client eğer tekrar aynı ID ile istekte bulunursa, API Gateway bu sefer projeye gitmek yerine Redis içerisindeki cache üzerinden veriyi dönmektedir.

Bu konfigürasyon dosyasını Program.cs üzerindeki CreateHostBuilder metodu içerisinde aşağıdaki şekilde kullanarak, ayarları tanımlayalım:

Program.cs

Startup.cs dosyamızda ise Ocelot ve Redis caching yapısını şu şekilde konfigüre etmemiz gerekmektedir:

ConfigureServices metodu içerisinde Ocelot servisini ayarlarken, cache yöneticisi olarak Redis kullandık. Sonrasında bu konfigürasyona “redis” ismini verdik. Konfigürasyon; Redis sunucusunun localhost:6379 (varsayılan) adresinde olduğunu, 0 index numaralı veritabanını admin yetkileri ile kullanacağımızı belirtmektedir. Ayrıca verilerimizi JSON Serialize ederek saklayacağımızı ve Ocelot üzerinde handle edeceğimiz Redis ayarının “redis” ismindeki konfigürasyon olduğunu belirlemiş olduk.

Controller Yapımız

DotNet ‘in varsayılan API Teması olan hava durumu teması içerisinde yer alan WeatherForecastController içerisine aşağıdaki şekliyle yeni bir aksiyon ekleyelim:

Aksiyondan kısaca bahsetmemiz gerekirse; şehir ID değeri verilen şehire ait 30 günlük hava tahmini verisi dönmektedir. Burada ID değerinin listenin boyutundan büyük olabileceği veya negatif bir ID değeri gönderilebileceği gibi bir takım denetimlerden yoksun bırakılarak yine oldukça sade bir anlatım tercih ettim.

Çalıştırma Zamanı

Projemizi başlattığımızda; ilk olarak localhost:6379 adresinde bir Redis sunucusu olup olmadığı kontrol edilmektedir. Buradaki SoF (single of failure) noktası budur. Yani o adrese erişim olmadığı durumda proje ayağa kalmamaktadır.

Projemizi ayağa kaldırdıktan sonra aşağıdaki şekilde test edebiliriz:

Dizinin 5. elemanı (id:4) olan Ardahan şehrine ilişkin rastgele oluşturulmuş bir aylık hava tahmini JSON olarak dönmektedir. Şimdi bu adrese breakpoint koyup tekrar istek attığımızda artık ilgili breakpointe gelmeden doğrudan Redis içerisinden veriyi çekmektedir.

Redis içerisinde bu isteğe ait bir HSET tipinde key oluşturup içerisinde Ocelot.Cache.CacheResponse tipinde veri saklamaktadır.

--

--

Çeşitli yazılım dillerinde ve platformlarında projeler oluşturmak üzere paylaşımlarda bulunduğum kişisel blog.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store