限流策略
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)
});
});最佳实践
- 登录接口:应用严格限流防止暴力破解
- 验证码接口:限流防止短信轰炸
- 公开接口:适度限流保护服务资源
- 内部接口:可豁免限流
相关文件
| 文件 | 说明 |
|---|---|
Program.cs | 限流中间件配置 |
Youlai.Api/Middleware/RateLimitMiddleware.cs | 限流中间件 |
