Skip to content

限流策略

youlai-aspnet 基于 ASP.NET Core 内置限流中间件实现接口保护。

限流算法

算法说明适用场景
固定窗口固定时间窗口内限制请求数简单限流
滑动窗口平滑限流,避免突刺精确限流
令牌桶允许突发流量API 网关
并发限制限制并发请求数资源保护

配置方式

固定窗口限流

csharp
// Program.cs
builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("fixed", options =>
    {
        options.PermitLimit = 100;
        options.Window = TimeSpan.FromMinutes(1);
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        options.QueueLimit = 10;
    });
});

app.UseRateLimiter();

控制器应用

csharp
[EnableRateLimiting("fixed")]
[ApiController]
[Route("api/v1/[controller]")]
public class UsersController : ControllerBase
{
    // 所有接口应用限流
}

单个接口应用

csharp
[EnableRateLimiting("strict")]
[HttpPost("login")]
public async Task<ActionResult> Login(LoginRequest request)
{
    // 仅登录接口应用严格限流
}

限流响应

超过限流阈值时返回 HTTP 429:

json
{
  "code": "A0506",
  "msg": "请求过于频繁,请稍后再试"
}

自定义限流策略

csharp
options.AddPolicy("ip-based", httpContext =>
{
    var ip = httpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";
    return RateLimitPartition.GetFixedWindowLimiter(ip, _ => new FixedWindowRateLimiterOptions
    {
        PermitLimit = 100,
        Window = TimeSpan.FromMinutes(1)
    });
});

最佳实践

  1. 登录接口:应用严格限流防止暴力破解
  2. 验证码接口:限流防止短信轰炸
  3. 公开接口:适度限流保护服务资源
  4. 内部接口:可豁免限流

相关文件

文件说明
Program.cs限流中间件配置
Youlai.Api/Middleware/RateLimitMiddleware.cs限流中间件

基于 MIT 许可发布