.NET 8 中 Web API 中的速率限制

作者:微信公众号:【架构师老卢】
9-20 19:52
180

在本文中,我们将了解什么是速率限制,并了解如何在 .NET 8 API 中实现它。简单来说,速率限制在概念上将限制可以访问的资源量。

什么是速率限制?

首先,让我们通过一般示例来了解速率限制。这就像对汽车在高速公路上的行驶速度设置限速。将您的 API 想象成一条高速公路,而发送到 API 的请求则想象成这条高速公路上的汽车。速率限制就像设置交通标志,上面写着“每 10 分钟只有 100 辆车可以通过这个收费站”。此限制可防止太多请求同时涌入您的 API,这可能会减慢它的速度甚至崩溃,就像高速公路上的汽车太多会导致交通拥堵一样。它还确保所有汽车(请求)都有公平的机会沿着高速公路移动(使用 API),而不会被困在大交通拥堵(服务器过载)后面。

为什么需要 Rate Limiting?

.NET Web API 中的速率限制至关重要,原因有几个,主要侧重于维护应用程序及其资源的稳定性、安全性和公平使用。以下是速率限制在 .NET Web API 中很重要的一些关键原因:

  • 防止暴力攻击 — 速率限制有助于防止恶意用户发起暴力攻击,他们反复尝试猜测用户名、密码或其他敏感信息。
  • 缓解 DoS 和 DDoS 攻击 — 通过限制客户端在特定时间范围内可以发出的请求数量,速率限制有助于减轻拒绝服务 (DoS) 和分布式拒绝服务 (DDoS) 攻击的影响。
  • 资源使用的公平性 — 速率限制可确保 API 的所有用户或客户端公平使用资源。它可以防止单个用户或应用程序消耗过多的资源,这可能会影响其他用户的体验。
  • 避免系统过载 — 通过限制传入请求的速率,您可以防止 API 服务器或后端系统在使用高峰时段过载。
  • 优化服务器性能 — 速率限制通过均匀分配负载来帮助保持 API 服务器的最佳性能。它可以防止流量突然激增,从而导致性能下降或服务器崩溃。
  • 减少延迟 — 通过防止过载,速率限制可确保 API 迅速响应传入请求,从而减少延迟并提高整体响应能力。
  • 遵守 API 服务条款 — 许多第三方 API 和服务提供商都设置了速率限制,以控制对其服务的访问。通过在您自己的 API 中实施速率限制,您可以在与外部 API 交互时遵守这些要求。
  • 避免服务暂停 — 不遵守外部服务施加的速率限制可能会导致暂时或永久暂停对这些服务的访问。实施速率限制有助于避免此类中断。
  • 防止抓取 — 速率限制可以防止 Web 抓取机器人从您的 API 中收集大量数据,从而保护您的数据免受未经授权的访问和滥用。
  • 限制敏感数据的泄露 — 通过控制请求速率,您可以防止无意中泄露敏感数据或不应公开访问的 API。
  • 控制使用成本 — 对于具有基于使用量的定价模型的 API,速率限制通过限制每个用户或客户端进行的 API 调用次数来帮助控制成本。
  • 服务等级协议 (SLA) — 速率限制通过确保可预测且一致的服务水平,帮助您满足与用户或客户端签订的服务等级协议 (SLA)。
  • 精细流量分析 — 速率限制允许您监控和分析流量模式,识别潜在威胁或滥用,并就扩展资源做出明智的决策。

有不同类型的速率限制算法,我们将在以后的博客中详细介绍每种算法,但在本博客中,让我们看看使用 Microsoft.AspNetCore.RateLimiting 中间件进行速率限制的效果。首先在 Visual Studio 中创建一个示例 Web API 项目。然后使用以下命令添加速率限制 NuGet 包:

dotnet add package Microsoft.AspNetCore.RateLimiting

现在让我们使用 AddRateLimiter 和 UseRateLimiter 配置速率限制,如下所示。

// Adding Rate Limiting  
builder.Services.AddRateLimiter(options => {  
    options.AddFixedWindowLimiter("Fixed", opt => {  
        opt.Window = TimeSpan.FromSeconds(10);  
        opt.PermitLimit = 3;  
    });  
});  
  
app.UseRateLimiter();

接下来,在终端节点级别添加策略,如下所示。

[HttpGet(Name = "GetWeatherForecast")]  
[EnableRateLimiting("Fixed")]  
public IEnumerable<WeatherForecast> Get()  
{  
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast  
    {  
        Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),  
        TemperatureC = Random.Shared.Next(-20, 55),  
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]  
    })  
    .ToArray();  
}

在此示例中,我们将速率限制配置为仅在 10 秒内点击 API 3 次的用户,因此,一旦请求数在几秒钟内超过 3 次,我们将看到 API 终端节点返回 503,如下所示。

我们可以自定义在超出 rate limit 的情况下返回的状态代码,如下所示。

// Adding Rate Limiting  
builder.Services.AddRateLimiter(options => {  
    options.AddFixedWindowLimiter("Fixed", opt => {  
        opt.Window = TimeSpan.FromSeconds(10);  
        opt.PermitLimit = 3;  
    });  
    options.RejectionStatusCode = 429;  
});

然后,当超出速率限制时,我们会得到以下结果。

我们已经了解了什么是速率限制,为什么需要速率限制,并了解了如何使用 RateLimiting NuGet 包配置 .NET Web API。至此,我们结束了本博客,在以后的博客中,我们可以看到什么是不同的速率限制算法,以及如何在 Web API 中配置它们。

相关留言评论
昵称:
邮箱:
阅读排行