近期项目中,提供了一些挪用频率较高的api接口,需要保障处事器的不变运行;需要对提供的接口举办限流节制。制止因客户端频繁的请求导致处事器的压力。
一、AspNetCoreRateLimit 先容AspNetCoreRateLimit 是一个ASP.NET Core速率限制的办理方案,旨在节制客户端按照IP地点或客户端ID向Web API或MVC应用发出的请求的速率。AspNetCoreRateLimit包括一个 IpRateLimitMiddleware 和 ClientRateLimitMiddleware ,每其中间件可以按照差异的场景设置限制答允IP或客户端,自界说这些限制计策,也可以将限制计接应用在每个API URL或详细的HTTP Method上。
二、AspNetCoreRateLimit利用由上面先容可知AspNetCoreRateLimit支持了两种方法:基于 客户端IP( IpRateLimitMiddleware) 和客户端ID( ClientRateLimitMiddleware )速率限制 接下来就别离说明利用方法
添加Nuget包引用:
Install-Package AspNetCoreRateLimit
基于客户端IP速率限制1、修改Startup.cs中要领:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //需要从加载设置文件appsettings.json services.AddOptions(); //需要存储速率限制计较器和ip法则 services.AddMemoryCache(); //从appsettings.json中加载通例设置,IpRateLimiting与设置文件中节点对应 services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting")); //从appsettings.json中加载Ip法则 services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies")); //注入计数器和法则存储 services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); services.AddControllers(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); //设置(理会器、计数器密钥生成器) services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); //Other Code } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //Other Code app.UseRouting(); app.UseAuthorization(); //启用客户端IP限制速率 app.UseIpRateLimiting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
2、在appsettings.json中添加通用设置项节点:(IpRateLimiting节点与Startup中取的节点对应)
"IpRateLimiting": { //false,则全局将应用限制,而且仅应用具有作为端点的法则*。譬喻,假如您配置每秒5次挪用的限制,则对任何端点的任何HTTP挪用都将计入该限制 //true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。譬喻,假如您为*:/api/values客户端配置每秒5个呼唤的限制, "EnableEndpointRateLimiting": false, //false,拒绝的API挪用不会添加到挪用次数计数器上;如 客户端每秒发出3个请求而且您配置了每秒一个挪用的限制,则每分钟或天天计数器等其他限制将仅记录第一个挪用,即乐成的API挪用。假如您但愿被拒绝的API挪用计入其他时间的显示(分钟,小时等) //,则必需配置StackBlockedRequests为true。 "StackBlockedRequests": false, //Kestrel 处事器背后是一个反向署理,假如你的署理处事器利用差异的页眉然后提取客户端IP X-Real-IP利用此选项来配置 "RealIpHeader": "X-Real-IP", //取白名单的客户端ID。假如此标头中存在客户端ID而且与ClientWhitelist中指定的值匹配,则不该用速率限制。 "ClientIdHeader": "X-ClientId", //限制状态码 "HttpStatusCode": 429, ////IP白名单:支持Ip v4和v6 //"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": "*", //时间段,名目:{数字}{单元};可利用单元:s, m, h, d "Period": "1s", //限制 "Limit": 2 }, //15分钟只能挪用100次 {"Endpoint": "*","Period": "15m","Limit": 100}, //12H只能挪用1000 {"Endpoint": "*","Period": "12h","Limit": 1000}, //7天只能挪用10000次 {"Endpoint": "*","Period": "7d","Limit": 10000} ] }
设置节点已添加相应注释信息。
法则配置名目:
端点名目: {HTTP_Verb}:{PATH} ,您可以利用asterix标记来定位任何HTTP谓词。
期间名目: {INT}{PERIOD_TYPE} ,您可以利用以下期间范例之一: s, m, h, d 。
限制名目: {LONG}
3、特点Ip限制法则配置,在appsettings.json中添加 IP法则设置节点