1. 程式人生 > 其它 >限流中介軟體IpRateLimitMiddleware的使用

限流中介軟體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中指定的值匹配,則不應用速率限制。

測試