限流中间件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中指定的值匹配,則不應用速率限制。
測試
總結
以上是生活随笔為你收集整理的限流中间件IpRateLimitMiddleware的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何通过 C# 判断一个 路径 是本机还
- 下一篇: Win11新版右键菜单用不惯?一键切换回