限流中介軟體IpRateLimitMiddleware的使用
前言
IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一個限流的中介軟體,用於控制客戶端呼叫API的頻次, 如果客戶端頻繁訪問伺服器,可以限制它的頻率,已降低訪問伺服器端的壓力。或者如果有爬蟲在爬取關鍵資料,也可以限制某個/某些API或者某些IP的每天調取次數, 這樣限制他爬取的速度。
當然, 其實我要解決的是另外一個問題。 我們寫的WebApi有時候會存在一些API,我們只希望其它內部應用來呼叫,比如,WebApi的HealthCheck, 我們就希望只有我們的中臺可以定時呼叫來獲取資訊, 而前端是不能呼叫。這個我們就可以把內部的IP地址放到IpWhitelist配置項中, 並且限制特定的API呼叫次數為0次, 這樣只有白名單裡面的地址可以訪問對應的端點, 如下所示。
使用
NuGet安裝:Install-Package AspNetCoreRateLimit
Startup 配置
public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { //新增IP限流 //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest); //services.AddOptions(); //services.AddMemoryCache(); //services.Configure<IpRateLimitOptions>(App.Configuration.GetSection("IpRateLimit")); //services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>(); //services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); //services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); //services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); //services.AddHttpContextAccessor(); }
Configure 呼叫中介軟體UseIpRateLimiting
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//啟用限流
//app.UseIpRateLimiting();
}
appsettings.json
配置
"IpRateLimit": { "EnableEndpointRateLimiting": true, "StackBlockedRequests": false, "RealIPHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "GeneralRules": [ { "Endpoint": "*:/file/multipart/upload", "Period": "1s", "Limit": 20 }, { "Endpoint": "*", "Period": "1s", "Limit": 2 }, { "Endpoint": "*", "Period": "15m", "Limit": 300 }, { "Endpoint": "*", "Period": "12h", "Limit": 3000 }, { "Endpoint": "*", "Period": "7d", "Limit": 50000 } ] }
配置說明
如果EnableEndpointRateLimiting設定為false則全域性將應用限制,並且僅應用具有作為端點的規則*。例如,如果您設定每秒5次呼叫的限制,則對任何端點的任何HTTP呼叫都將計入該限制。
如果EnableEndpointRateLimiting設定為true,則限制將應用於每個端點,如{HTTP_Verb}{PATH}。例如,如果您為*:/api/values客戶端設定每秒5個呼叫的限制,則可以GET /api/values每秒呼叫5次,但也可以呼叫5次PUT /api/values。
如果StackBlockedRequests設定為false,拒絕的API呼叫不會新增到呼叫次數計數器上。比如: 如果客戶端每秒發出3個請求並且您設定了每秒一個呼叫的限制,則每分鐘或每天計數器等其他限制將僅記錄第一個呼叫,即成功的API呼叫。如果您希望被拒絕的API呼叫計入其他時間的顯示(分鐘,小時等),則必須設定StackBlockedRequests為true。
在RealIpHeader使用時,你的Kestrel 伺服器背後是一個反向代理,如果你的代理伺服器使用不同的頁首然後提取客戶端IP X-Real-IP使用此選項來設定它。
將ClientIdHeader被用於提取白名單的客戶端ID。如果此標頭中存在客戶端ID並且與ClientWhitelist中指定的值匹配,則不應用速率限制。