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 Request’lerin sıklığının performans 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.
- .NET 5.0 SDK (https://dotnet.microsoft.com/download/dotnet/5.0)
- Visual Studio Code (https://code.visualstudio.com)
Visual Studio Code Terminal’i üzerinden aşağıdaki komutu kullanarak yeni bir Web API projesi oluşturalım. (Resim – 2)
- dotnet 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.
- https://localhost:5001/swagger/index.html
Alternatif olarak Postman veya başka bir Tool 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ı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://github.com/stefanprodan/AspNetCoreRateLimit
https://github.com/sertaceren/rate-limiting-example
TAGs: rate limit, IP rate limit, rate limiting, application rate limiting, backend 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
Çok aydınlatıcı ve sade bir yazı olmuş, eline sağlık.
Çok teşekkür ederim değerli yorumun için.