当前位置:   article > 正文

.Net Core 限流控制-AspNetCoreRateLimit

netcoer 蜘蛛流量控制

简介

AspNetCoreRateLimit是ASP.NET核心速率限制框架,能够对WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件,每个中间件都可以为不同的场景设置多个限,该框架的作者是stefanprodan,项目nuget地址是https://github.com/stefanprodan/AspNetCoreRateLimit。

IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访问服务器,可以限制它的频率,已降低访问服务器端的压力。或者如果有爬虫在爬取关键数据,也可以限制某个/某些API或者某些IP的每天调取次数, 这样限制他爬取的速度。

使用方法

NuGet 安装:

  1. Install-Package AspNetCoreRateLimit
  2. Install-Package AspNetCoreRateLimit.Redis

Startup.cs 代码:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3.  // needed to load configuration from appsettings.json
  4.  services.AddOptions();
  5.  // needed to store rate limit counters and ip rules
  6.  services.AddMemoryCache();
  7.  //load general configuration from appsettings.json
  8.  services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
  9.  //load ip rules from appsettings.json
  10.  services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));
  11.  // inject counter and rules stores
  12.  services.AddInMemoryRateLimiting();
  13.         //services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>();
  14.         //services.AddDistributedRateLimiting<RedisProcessingStrategy>();
  15.         //services.AddRedisRateLimiting();
  16.  // Add framework services.
  17.  services.AddMvc();
  18.         // configuration (resolvers, counter key builders)
  19.         services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
  20. }
  21. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  22. {
  23.  app.UseIpRateLimiting();
  24.  app.UseMvc();
  25. }

您应该在注册任何其他组件之前注册中间件。

如果你对应用程序进行负载平衡,你需要将IDistributedCache与Redis或SQLServer一起使用,以便所有kestrel实例都具有相同的速率限制存储。您应该像这样注入分布式存储,而不是内存存储:

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

配置和一般规则应用程序设置appsettings.json::

  1. "IpRateLimiting": {
  2.     "EnableEndpointRateLimiting"false,
  3.     "StackBlockedRequests"false,
  4.     "RealIpHeader""X-Real-IP",
  5.     "ClientIdHeader""X-ClientId",
  6.     "HttpStatusCode"429,
  7.     "IpWhitelist": [ "127.0.0.1""::1/10""192.168.0.0/24" ],
  8.     "EndpointWhitelist": [ "get:/api/license""*:/api/status" ],
  9.     "ClientWhitelist": [ "dev-id-1""dev-id-2" ],
  10.     "GeneralRules": [
  11.       {
  12.         "Endpoint""*",
  13.         "Period""1s",
  14.         "Limit"2
  15.       },
  16.       {
  17.         "Endpoint""*",
  18.         "Period""15m",
  19.         "Limit"100
  20.       },
  21.       {
  22.         "Endpoint""*",
  23.         "Period""12h",
  24.         "Limit"1000
  25.       },
  26.       {
  27.         "Endpoint""*",
  28.         "Period""7d",
  29.         "Limit"10000
  30.       }
  31.     ]
  32.   }

如果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中指定的值匹配,则不应用速率限制。

  1. "IpRateLimitPolicies": {
  2.     "IpRules": [
  3.       {
  4.         "Ip""84.247.85.224",
  5.         "Rules": [
  6.           {
  7.             "Endpoint""*",
  8.             "Period""1s",
  9.             "Limit"10
  10.           },
  11.           {
  12.             "Endpoint""*",
  13.             "Period""15m",
  14.             "Limit"200
  15.           }
  16.         ]
  17.       },
  18.       {
  19.         "Ip""192.168.3.22/25",
  20.         "Rules": [
  21.           {
  22.             "Endpoint""*",
  23.             "Period""1s",
  24.             "Limit"5
  25.           },
  26.           {
  27.             "Endpoint""*",
  28.             "Period""15m",
  29.             "Limit"150
  30.           },
  31.           {
  32.             "Endpoint""*",
  33.             "Period""12h",
  34.             "Limit"500
  35.           }
  36.         ]
  37.       }
  38.     ]
  39.   }

IP字段支持IP v4和v6的值和范围,如“192.168.0.0/24”、“fe80::/10”或“192.168.0.0-192.168.0.255”。

  • 技术群:添加小编微信并备注进群

    小编微信:mm1552923   

    公众号:dotNet编程大全    

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/788451
推荐阅读
相关标签
  

闽ICP备14008679号