一、添加AspNetCoreRateLimit包
二、在appsettings.json添加限流配置
//限流配置
"IpRateLimiting": {
// 是否启用按终结点进行速率限制
"EnableEndpointRateLimiting": true,
// 是否堆叠被阻止的请求
"StackBlockedRequests": false,
// 实际 IP 头标识,用于从请求中获取客户端真实 IP 地址
"RealIPHeader": "X-Real-IP",
// 客户端 ID 头标识,用于标识不同的客户端
"ClientIdHeader": "X-ClientId",
// 速率限制超过限制时返回的 HTTP 状态码
"HttpStatusCode": 429,
// 通用规则,适用于所有终结点
"GeneralRules": [
{
// 终结点名称,* 表示所有终结点
"Endpoint": "*",
// 限制周期,以秒为单位
"Period": "1s",
// 在限制周期内允许的最大请求数
"Limit": 5
},
{
"Endpoint": "get:/Student/All",
"Period": "5s",
"Limit": 1
}
],
//拦截时返回参数
"QuotaExceededResponse": {
//返回内容
"Content": "{{ \"success\": false, \"resultCode\": 105, \"resultDesc\": \"频繁请求,请稍后在试\"}}",
//格式
"ContentType": "application/json",
//状态码
"StatusCode": "200"
}
}
上述的配置代表1秒钟内最多允许发起 5 个请求。
“get:/Student/All” 代表指定路径5秒钟内最多允许发起1 个Get请求
三、在Program.cs配置IP限速
#region 配置IP 限速
// Github项目地址:https://github.com/stefanprodan/AspNetCoreRateLimit
// 文档:https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup
builder.Services.AddOptions(); // 添加配置选项服务
builder.Services.AddMemoryCache(); // 添加内存缓存服务
builder.Services.Configure<IpRateLimitOptions>(configuration.GetSection("IpRateLimiting")); // 配置IP限速选项,使用名为 "IpRateLimiting" 的配置节
builder.Services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); // 注册单例模式的 IIpPolicyStore 服务,使用内存缓存实现
builder.Services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); // 注册单例模式的 IRateLimitCounterStore 服务,使用内存缓存实现
builder.Services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>(); // 注册单例模式的 IProcessingStrategy 服务,使用异步键锁处理策略实现
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); // 注册单例模式的 IRateLimitConfiguration 服务,使用 RateLimitConfiguration 实现
#endregion
启用IP限速
#region 启用 IP 限速
app.UseIpRateLimiting();
#endregion
四、效果展示
在5秒内请求了大于1次就会提示“频繁请求,请稍后在试”
在5秒内请求了1次,就会正常响应
上面是指定路径,其他路径的接口都是“按照1秒钟内最多允许发起 5 个请求”为规则,大家可以自行测试一下