在本文中,我们将了解什么是速率限制,并了解如何在 .NET 8 API 中实现它。简单来说,速率限制在概念上将限制可以访问的资源量。
首先,让我们通过一般示例来了解速率限制。这就像对汽车在高速公路上的行驶速度设置限速。将您的 API 想象成一条高速公路,而发送到 API 的请求则想象成这条高速公路上的汽车。速率限制就像设置交通标志,上面写着“每 10 分钟只有 100 辆车可以通过这个收费站”。此限制可防止太多请求同时涌入您的 API,这可能会减慢它的速度甚至崩溃,就像高速公路上的汽车太多会导致交通拥堵一样。它还确保所有汽车(请求)都有公平的机会沿着高速公路移动(使用 API),而不会被困在大交通拥堵(服务器过载)后面。
.NET Web API 中的速率限制至关重要,原因有几个,主要侧重于维护应用程序及其资源的稳定性、安全性和公平使用。以下是速率限制在 .NET Web API 中很重要的一些关键原因:
有不同类型的速率限制算法,我们将在以后的博客中详细介绍每种算法,但在本博客中,让我们看看使用 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 中配置它们。