2023年5月,如何使用AspNetCoreRateLimit在.NET Core项目中实现高效限流?

2026-03-30 15:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1205个文字,预计阅读时间需要5分钟。

2023年5月,如何使用AspNetCoreRateLimit在.NET Core项目中实现高效限流?

(文章目录)前言 + AspNetCoreRateLimit + 是一种 ASP.NET Core 速度限制解决方案,基于 IP、地址或客户端端 ID 控制 Web API 或 MVC 应用的请求速率。AspNetCoreRateLimit 包含一个 IpR 功能。

(文章目录)


前言

AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在根据 IP 地址或客户端 ID 控制客户端可以向 Web API 或 MVC 应用发出的请求速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware,每个中间件您可以针对不同的场景设置多个限制,例如允许 IP 或客户端在时间间隔内(如每秒、15 分钟等)进行最大调用次数。您可以定义这些限制以处理对 API 发出的所有请求,也可以将限制范围限定为每个 API URL 或 HTTP 谓词和路径。

2023年5月,如何使用AspNetCoreRateLimit在.NET Core项目中实现高效限流?

AspNetCoreRateLimit项目地址:github.com/stefanprodan/AspNetCoreRateLimit

一、AspNetCoreRateLimit限流的使用

项目是支持.NET 7的,本文以.NET 7的WEBAPI为例

1.安装包

Install-Package AspNetCoreRateLimit Install-Package AspNetCoreRateLimit.Redis

2.appsettings.json文件配置

{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "IpRateLimiting": { "EnableEndpointRateLimiting": false, "StackBlockedRequests": false, "RealIpHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "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": "*", "Period": "1s", "Limit": 2 }, { "Endpoint": "*", "Period": "15m", "Limit": 100 }, { "Endpoint": "*", "Period": "12h", "Limit": 1000 }, { "Endpoint": "*", "Period": "7d", "Limit": 10000 } ] }, "IpRateLimitPolicies": { "IpRules": [ { "Ip": "84.247.85.224", "Rules": [ { "Endpoint": "*", "Period": "1s", "Limit": 10 }, { "Endpoint": "*", "Period": "15m", "Limit": 200 } ] }, { "Ip": "192.168.3.22/25", "Rules": [ { "Endpoint": "*", "Period": "1s", "Limit": 5 }, { "Endpoint": "*", "Period": "15m", "Limit": 150 }, { "Endpoint": "*", "Period": "12h", "Limit": 500 } ] } ] } }

3.服务的注入与使用

3.1 本地单机配置

using AspNetCoreRateLimit; using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); #region 注入限流 //需要从appsettings.json加载配置 builder.Services.AddOptions(); //需要存储速率限制计数器和ip规则 builder.Services.AddMemoryCache(); //从appsettings.json加载常规配置 builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting")); //从appsettings.json加载ip规则 builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies")); // 注入计数器和规则存储 builder.Services.AddInMemoryRateLimiting(); //services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>(); //services.AddDistributedRateLimiting<RedisProcessingStrategy>(); //services.AddRedisRateLimiting(); builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); #endregion var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } #region 使用限流 app.UseIpRateLimiting(); #endregion app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

3.2 分布式限流配置

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

services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>(); services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

二、AspNetCoreRateLimit限流的使用参数说明

IpRateLimiting的主要配置说明:

  • EnableEndpointRateLimiting:设置为false,则限制将全局应用,并且只有作为endpoint的规则将应用。例如,如果设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制。设置为true,则限制将应用于每个端点,如{HTTP\u Verb}{PATH}。例如,如果为:/api/values设置每秒5次调用的限制,客户端可以每秒调用5次GET/api/values,但也可以调用5次PUT/api/values。
  • StackBlockedRequests:设置为false,则拒绝的呼叫不会添加到油门计数器。如果一个客户端每秒发出3个请求,而您已将限制设置为每秒一个呼叫,那么其他限制(如每分钟或每天计数器)将只记录未被阻止的第一个呼叫。如果希望拒绝的请求计入其他限制,则必须将StackBlockedRequests设置为true。
  • X-Real-IP:当Kestrel服务器位于反向代理后时,RealiPeader用于提取客户端IP,如果代理使用不同的头,则X-Real-IP使用此选项进行设置。
  • ClientHeader:用于提取白名单的客户端id。如果此标头中存在客户端id,并且与ClientWhitelist中指定的值匹配,则不应用速率限制。

IpRateLimitPolicies的主要配置说明:

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

这边只是讲解了基本用法,更多详细用法可以参考官网

本文共计1205个文字,预计阅读时间需要5分钟。

2023年5月,如何使用AspNetCoreRateLimit在.NET Core项目中实现高效限流?

(文章目录)前言 + AspNetCoreRateLimit + 是一种 ASP.NET Core 速度限制解决方案,基于 IP、地址或客户端端 ID 控制 Web API 或 MVC 应用的请求速率。AspNetCoreRateLimit 包含一个 IpR 功能。

(文章目录)


前言

AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在根据 IP 地址或客户端 ID 控制客户端可以向 Web API 或 MVC 应用发出的请求速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware,每个中间件您可以针对不同的场景设置多个限制,例如允许 IP 或客户端在时间间隔内(如每秒、15 分钟等)进行最大调用次数。您可以定义这些限制以处理对 API 发出的所有请求,也可以将限制范围限定为每个 API URL 或 HTTP 谓词和路径。

2023年5月,如何使用AspNetCoreRateLimit在.NET Core项目中实现高效限流?

AspNetCoreRateLimit项目地址:github.com/stefanprodan/AspNetCoreRateLimit

一、AspNetCoreRateLimit限流的使用

项目是支持.NET 7的,本文以.NET 7的WEBAPI为例

1.安装包

Install-Package AspNetCoreRateLimit Install-Package AspNetCoreRateLimit.Redis

2.appsettings.json文件配置

{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "IpRateLimiting": { "EnableEndpointRateLimiting": false, "StackBlockedRequests": false, "RealIpHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "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": "*", "Period": "1s", "Limit": 2 }, { "Endpoint": "*", "Period": "15m", "Limit": 100 }, { "Endpoint": "*", "Period": "12h", "Limit": 1000 }, { "Endpoint": "*", "Period": "7d", "Limit": 10000 } ] }, "IpRateLimitPolicies": { "IpRules": [ { "Ip": "84.247.85.224", "Rules": [ { "Endpoint": "*", "Period": "1s", "Limit": 10 }, { "Endpoint": "*", "Period": "15m", "Limit": 200 } ] }, { "Ip": "192.168.3.22/25", "Rules": [ { "Endpoint": "*", "Period": "1s", "Limit": 5 }, { "Endpoint": "*", "Period": "15m", "Limit": 150 }, { "Endpoint": "*", "Period": "12h", "Limit": 500 } ] } ] } }

3.服务的注入与使用

3.1 本地单机配置

using AspNetCoreRateLimit; using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); #region 注入限流 //需要从appsettings.json加载配置 builder.Services.AddOptions(); //需要存储速率限制计数器和ip规则 builder.Services.AddMemoryCache(); //从appsettings.json加载常规配置 builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting")); //从appsettings.json加载ip规则 builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies")); // 注入计数器和规则存储 builder.Services.AddInMemoryRateLimiting(); //services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>(); //services.AddDistributedRateLimiting<RedisProcessingStrategy>(); //services.AddRedisRateLimiting(); builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); #endregion var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } #region 使用限流 app.UseIpRateLimiting(); #endregion app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

3.2 分布式限流配置

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

services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>(); services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

二、AspNetCoreRateLimit限流的使用参数说明

IpRateLimiting的主要配置说明:

  • EnableEndpointRateLimiting:设置为false,则限制将全局应用,并且只有作为endpoint的规则将应用。例如,如果设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制。设置为true,则限制将应用于每个端点,如{HTTP\u Verb}{PATH}。例如,如果为:/api/values设置每秒5次调用的限制,客户端可以每秒调用5次GET/api/values,但也可以调用5次PUT/api/values。
  • StackBlockedRequests:设置为false,则拒绝的呼叫不会添加到油门计数器。如果一个客户端每秒发出3个请求,而您已将限制设置为每秒一个呼叫,那么其他限制(如每分钟或每天计数器)将只记录未被阻止的第一个呼叫。如果希望拒绝的请求计入其他限制,则必须将StackBlockedRequests设置为true。
  • X-Real-IP:当Kestrel服务器位于反向代理后时,RealiPeader用于提取客户端IP,如果代理使用不同的头,则X-Real-IP使用此选项进行设置。
  • ClientHeader:用于提取白名单的客户端id。如果此标头中存在客户端id,并且与ClientWhitelist中指定的值匹配,则不应用速率限制。

IpRateLimitPolicies的主要配置说明:

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

这边只是讲解了基本用法,更多详细用法可以参考官网