.Net Core 限流控制-AspNetCoreRateLimit

語言: CN / TW / HK

AspNetCoreRateLimit是ASP.NET核心速率限制框架,能夠對WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含IpRateLimit中介軟體和ClientRateLimit中介軟體,每個中介軟體都可以為不同的場景設定多個限,該框架的作者是stefanprodan,專案nuget地址是https://github.com/stefanprodan/AspNetCoreRateLimit。

IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一個限流的中介軟體,用於控制客戶端呼叫API的頻次, 如果客戶端頻繁訪問伺服器,可以限制它的頻率,已降低訪問伺服器端的壓力。或者如果有爬蟲在爬取關鍵資料,也可以限制某個/某些API或者某些IP的每天調取次數, 這樣限制他爬取的速度。

使用方法

NuGet 安裝:


Install-Package AspNetCoreRateLimit

Install-Package AspNetCoreRateLimit.Redis

Startup.cs 程式碼:

public void ConfigureServices(IServiceCollection services)
{
// needed to load configuration from appsettings.json
services.AddOptions();

// needed to store rate limit counters and ip rules
services.AddMemoryCache();

//load general configuration from appsettings.json
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));

//load ip rules from appsettings.json
services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));

// inject counter and rules stores
services.AddInMemoryRateLimiting();
//services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>();
//services.AddDistributedRateLimiting<RedisProcessingStrategy>();
//services.AddRedisRateLimiting();

// Add framework services.
services.AddMvc();

// configuration (resolvers, counter key builders)
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseIpRateLimiting();

app.UseMvc();
}

您應該在註冊任何其他元件之前註冊中介軟體。

如果你對應用程式進行負載平衡,你需要將IDistributedCache與Redis或SQLServer一起使用,以便所有kestrel例項都具有相同的速率限制儲存。您應該像這樣注入分散式儲存,而不是記憶體儲存:

// inject counter and rules distributed cache stores
services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

配置和一般規則應用程式設定appsettings.json::

  "IpRateLimiting": {
"EnableEndpointRateLimiting": false,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
"EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
"GeneralRules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 2
},
{
"Endpoint": "*",
"Period": "15m",
"Limit": 100
},
{
"Endpoint": "*",
"Period": "12h",
"Limit": 1000
},
{
"Endpoint": "*",
"Period": "7d",
"Limit": 10000
}
]
}

如果EnableEndpointRateLimiting設定為false,則限制將全域性應用,並且只有作為endpoint*的規則將應用。例如,如果設定每秒5次呼叫的限制,則對任何端點的任何HTTP呼叫都將計入該限制。

如果EnableEndpointRateLimiting設定為true,則限制將應用於每個端點,如{HTTP\u Verb}{PATH}。例如,如果為*:/api/values設定每秒5次呼叫的限制,客戶端可以每秒呼叫5次GET/api/values,但也可以呼叫5次PUT/api/values。

如果StackBlockedRequests設定為false,則拒絕的呼叫不會新增到油門計數器。如果一個客戶端每秒發出3個請求,而您已將限制設定為每秒一個呼叫,那麼其他限制(如每分鐘或每天計數器)將只記錄未被阻止的第一個呼叫。如果希望拒絕的請求計入其他限制,則必須將StackBlockedRequests設定為true。

當Kestrel伺服器位於反向代理後時,RealiPeader用於提取客戶端IP,如果代理使用不同的頭,則X-Real-IP使用此選項進行設定。

ClientHeader用於提取白名單的客戶端id。如果此標頭中存在客戶端id,並且與ClientWhitelist中指定的值匹配,則不應用速率限制。

 "IpRateLimitPolicies": {
"IpRules": [
{
"Ip": "84.247.85.224",
"Rules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 10
},
{
"Endpoint": "*",
"Period": "15m",
"Limit": 200
}
]
},
{
"Ip": "192.168.3.22/25",
"Rules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 5
},
{
"Endpoint": "*",
"Period": "15m",
"Limit": 150
},
{
"Endpoint": "*",
"Period": "12h",
"Limit": 500
}
]
}
]
}

IP欄位支援IP v4和v6的值和範圍,如“192.168.0.0/24”、“fe80::/10”或“192.168.0.0-192.168.0.255”。