1. Ana Sayfa
  2. ASP.Net
  3. ASP.NET Core Rate Limiting

ASP.NET Core Rate Limiting

NETInnovation
JFORCE - Dell Technologies İşbirliği Başlıyor!

Bu makalemizde Rate Limiting nedir, neden önemlidir, hangi ihtiyaçlara yönelik kullanılır, bir .Net 5.0 Web API projesine Rate Limiting nasıl kolayca implement edilir gibi sorulara cevaplar arayacağız.

Uygulamalara gelen ’lerin sıklığının için kontrol edilmesi gerekebilir ya da API’lar için Request sınırlaması istenebilir. Request sınırlaması aynı zamanda API’ların ölçeklenebilir olmasına da yardımcı olur. Örneğin, public bir API’ın popülerliği artarsa, trafikte beklenmedik ani artışlar olabilir. Bu da ciddi response time’lara hatta uygulamaların cevap verememesine sebep olabilir. Özellikle uygulamalar doğrudan son kullanıcılara arz edilmişse bu kontroller oldukça önemlidir. Performans, Request sınırlaması yapmak için tek sebep değildir. Ek olarak uygulama güvenliği için de önemli bir bileşendir. Çünkü DoS/DDoS saldırıları ile uygulamalar cevap veremez hale gelebilir. Bu gibi ihtiyaçlardan dolayı Rate Limiting kavramı uygulamaların önemli bir parçası haline gelmiştir.

Şimdi de bir .Net 5.0 Web API projesi ile Rate Limiting kullanımını anlatacağımız senaryomuza geçebiliriz. Senaryo anlatımında Rate Limiting implementasyonu için AspNetCoreRateLimit Nuget Package’ını kullanacağız. İlgili Middleware’ın sunduğu özellikleri Resim – 1’ de görebilirsiniz. Daha fazlası için ilgili Nuget Package’ın Github hesabını ziyaret edebilirsiniz.

Resim – 1

Basit bir senaryo ile bu teorik bilgileri kolayca uygulayabileceğimiz bir proje oluşturalım. Senaryoya göre, Web API’da bulunan “/WeatherForecast” Endpoint’inin 1 dakikada en fazla 5 GET Request’ i ile sınırlandırılması isteniyor. Senaryo anlatımı için kullanılacak platform ve IDE aşağıdaki gibidir.

Visual Studio Code Terminal’i üzerinden aşağıdaki komutu kullanarak yeni bir Web API projesi oluşturalım. (Resim – 2)

  • new webapi -n rate-limiting-example

Resim – 2

Sonrasında aşağıdaki komut ile birlikte AspNetCoreRateLimit Nuget Package’ını projemize dahil edelim. (Resim – 3)

  • dotnet add package AspNetCoreRateLimit

Resim – 3

Oluşturulan projede Startup.ConfigureServices Method’u içerisinde AspNetCoreRateLimit  Middleware’ı için gerekli konfigürasyonları tanımlayalım. (Resim – 4)

Resim – 4

Yapılan bu konfigürasyonları kısaca açıklayacak olursak;

  • services.Configure<IpRateLimitOptions>(Configuration.GetSection(“IpRateLimiting”));

Middleware için gerekli olan tanımlamaların apsettings.json’dan okunmasını sağlar.

  • services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
  • services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

Middleware ile ilgili Policy ve Counter Data’ların Memory’de tutulması için gerekli konfigürasyonu sağlar.

  • services.AddHttpContextAccessor();

Middleware’ın sunmuş olduğu Client ve IP base özelliklerinin kullanılması için HttpContextAccessor servisi implement edilir.

Startup.Configure Method’u içerisinde ilgili code satırı ile Middleware uygulamaya implement edilir. (Resim – 5)

Resim – 5

Senaryoya uygun kural tanımını appsettings.json içerisinde oluşturalım. GeneralRules içerisinde görüldüğü üzere ilgili Endpoint için 1 dakikada 5 GET Request limiti tanımlandı. Limit aşımı sonrası için HttpStatusCode olarak 429 belirlendi.  (Resim – 6)

Resim – 6

Bu adımdan sonra senaryoyu tamamlamış bulunuyoruz ve çıktıları görmek için projeyi çalıştırabiliriz. .NET 5.0 ile birlikte yeni bir Web API projesi oluşturduğumuzda, default olarak WeatherForecastController Class’ı bizi karşılamaktadır. Testlerimiz için hazır olan bu Endpoint’i kullanacağız. Projeyi çalıştırdığımızda Request oluşturabilmek için default olarak gelen Swagger arayüzünü kullanacağız.

  • ://localhost:5001/swagger/index.html

Alternatif olarak Postman veya başka bir da kullanılabilir. Senaryoya göre beklentimiz, “/WeatherForecast” Endpoint’ine 1 dakika içerisinde gönderilen 5. GET Request’i sonrasında, Response’da  HttpStatusCode olarak 429 değerini görmek.

Resim – 7

Resim – 7 ‘de Swagger arayüzünden de görüldüğü üzere 6. GET Request’inde dönen HttpStatusCode 429’dur. Ayrıca Response body içerisinde customize edilebilen bir error message bizi karşılamaktadır.  Böylece senaryomuzu tamamlamış bulunuyoruz. Umarım sizler için de faydalı bir paylaşım olmuştur.

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar      

www.mshowto.org  

https://github.com/stefanprodan/AspNetCoreRateLimit

https://github.com/sertaceren/rate-limiting-example

TAGs: rate limit, IP rate limit, rate limiting, application rate limiting, , limit, API limiting, API, gateway, request, routing, .Net 5.0, ASP.NET Core, C#, ASP.NET Core MVC, ASP.NET WEB API, Visual Studio Code, VSCode, VS Code

JFORCE - Dell Technologies İşbirliği Başlıyor!
Yorum Yap

Yazar Hakkında

Lisans eğitimini Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünde tamamladı. Mezun olduktan sonra farklı sektörlerde ERP, CRM, Operasyon, POS, Finans, Bankacılık ve AML uygulamaları üzerine çalışma fırsatı buldu ve kariyerine finans sektörünün öncü firması olan Fineksus'ta devam etmektedir. Farklı platformlar ve yazılım dilleri ile web, mobil uygulamalar ve ürün geliştirme konularında deneyime sahip. Genel olarak Microsoft Teknolojileriyle ilgilenen Sertaç, .NET stack, C#, Web Services, SOAP, REST, ASP.NET, ASP.NET Core, MSSQL, PostgreSQL ve Node.js teknolojileri ile uygulama geliştirme tecrübesi edindi ve yeni teknolojiler öğrenmeye, öğrendiklerini paylaşmaya devam etmektedir.

Yorum Yap

Yorumlar (2)

  1. sertaceren_avatar
    3 hafta önce

    Çok aydınlatıcı ve sade bir yazı olmuş, eline sağlık.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir