网站首页 网站源码

按照你的要求,我已经完成了IP限流功能的重构:
Dpz.Core.InfrastructureIpRateLimitService 服务请求流程:
RateLimitMiddleware (第一层 - 限流)
↓
RejectBots (第二层 - 安全检查)
↓
业务逻辑 (第三层 - 正常处理)
| 组件 | 职责 | 位置 |
|---|---|---|
IpRateLimitService | 核心限流逻辑 | Dpz.Core.Infrastructure |
RateLimitMiddleware | 中间件集成 | Dpz.Core.Infrastructure |
RejectBots | 安全规则检查 | Dpz.Core.Web.Middleware |
// 原来的逻辑(简单拒绝)
if (超出限制) {
return 403; // 直接拒绝
}
// 新的逻辑(延迟处理)
if (超出限制) {
await Task.Delay(delayMs); // 延迟等待
// 继续处理请求
}
延迟时间 = 基础延迟 + (超出数量 × 延迟倍数)
例如:
- 第101次请求:1000ms (基础延迟)
- 第102次请求:1500ms (基础 + 1×500)
- 第105次请求:3500ms (基础 + 5×500)
- 最大限制:30000ms
public class RateLimitResult
{
bool IsAllowed; // 是否允许请求
bool ShouldDelay; // 是否需要延迟
int DelayMs; // 延迟时间
string Message; // 结果消息
}
// 三种结果:
Allow() // 正常通过
RateLimit() // 延迟处理
Block() // 直接拒绝(封禁期)
{
"RateLimit": {
"WindowSizeMinutes": 5, // 时间窗口
"MaxRequestsPerWindow": 100, // 窗口内最大请求
"MaxBlocksPerWindow": 3, // 窗口内最大拦截
"BlockDurationMinutes": 30, // 封禁时长
"CleanupIntervalMinutes": 60, // 清理间隔
"BaseDelayMs": 1000, // 基础延迟
"DelayMultiplierMs": 500, // 延迟倍数
"MaxDelayMs": 30000 // 最大延迟
}
}
// 方式1:默认配置
services.AddIpRateLimit();
// 方式2:代码配置
services.AddIpRateLimit(config => {
config.MaxRequestsPerWindow = 200;
config.BaseDelayMs = 2000;
});
// 方式3:配置文件
services.AddIpRateLimit(Configuration, "RateLimit");
客户端 → 超出限制 → 403错误 → 客户端重试 → 再次403 → 恶性循环
客户端 → 超出限制 → 延迟2秒 → 正常响应 → 客户端满意
| 场景 | 原来 | 现在 |
|---|---|---|
| 正常用户 | 可能被误杀 | 稍有延迟但能正常使用 |
| 爬虫工具 | 收到403后继续尝试 | 延迟增加,自然放慢 |
| 恶意攻击 | 达到拦截阈值后封禁 | 同样封禁,但正常用户不受影响 |
// 根据不同情况返回不同状态码
200 + 延迟 // 频率超限但允许处理
429 // IP被封禁
403 // 违反安全规则
var stats = rateLimitService.GetStats();
Console.WriteLine($"总跟踪IP: {stats.TotalTrackedIps}");
Console.WriteLine($"活跃IP: {stats.ActiveIps}");
Console.WriteLine($"被限流IP: {stats.RateLimitedIps}"); // 新增
Console.WriteLine($"被封禁IP: {stats.BlockedIps}");
X-RateLimit-Delay: 2000 // 延迟时间
X-RateLimit-Reason: 请求过于频繁 // 限流原因
INFO: 对IP 192.168.1.100 应用限流,延迟 2000ms,路径: /api/data
WARN: IP 192.168.1.101 超过请求限制,当前请求数: 105, 延迟: 3500ms
WARN: IP 192.168.1.102 因多次拦截被封禁,拦截次数: 3
// Program.cs
builder.Services.AddIpRateLimit(Configuration);
// Configure pipeline
app.UseIpRateLimit(); // 第一层:限流
app.UseMiddleware<RejectBots>(); // 第二层:安全检查
app.UseRouting(); // 第三层:路由
// ... 其他中间件
// 移除了内置的IP限流代码
// 专注于安全规则检查
// 向限流服务报告拦截事件
rateLimitService?.RecordBlock(clientIp);
ConcurrentDictionary// 可以扩展为分布式缓存
public class DistributedIpRateLimitService : IIpRateLimitService
{
private readonly IDistributedCache _cache;
// 使用Redis等实现跨实例限流
}
// 可以添加白名单功能
public bool IsWhitelisted(string ip) =>
_config.WhitelistIps.Contains(ip);
// 可以支持运行时配置更新
public void UpdateConfig(RateLimitConfig newConfig) =>
_config = newConfig;
创建了完整的测试套件:
通过这次重构,我们实现了:
现在你的应用具备了真正意义上的"限流"能力,既能保护系统安全,又能提供良好的用户体验!🚀
