ASP.NET Core Web API 中间件,实现速率限制无痛接入

什么是速率限制?

速率限制是一个用于控制特定资源在一段时间内允许的请求次数的功能。

在 .NET 7 中,我们可以使用内置的速率限制器中间件来配置与速率限制相关的设置。

那为什么要限制速率呢?

首先,通过限制网络流量,我们可以帮助降低服务器和网络资源使用成本。.

此外,通过减少发回响应的不必要延迟,还可以帮助我们提高应用程序的性能。

速率限制算法

固定窗口算法是最简单的算法之一。它将请求限制为一个固定的时间窗口,该窗口在任何时间点都只允许固定数量的请求。

滑动窗口算法是固定窗口算法的改进版本,它将请求限制为一个可变的窗口,该窗口在任何时间点都只允许固定数量的请求。

令牌桶算法使用固定大小的令牌桶来限制请求的速率。令牌桶最初被填满了指定数量的令牌。每次请求都会消耗一个令牌,如果令牌桶中没有令牌,则该请求会被拒绝。

并发算法是一种非常简单的算法,它只允许固定数量的并发请求,但是不限制一段时间内的请求数。

在 .NET 7 中使用速率限制中间件

在 ASP.NET Core Web API 项目中使用速率限制中间件非常简单。

首先,在 Program.cs 中添加以下代码,使用固定窗口算法,它将在任何给定的时间窗口内只允许固定数量的请求:

builder.Services.AddRateLimiter(p => p  
    .AddFixedWindowLimiter(policyName: "FixedWindow", options =>  
    {  
        options.PermitLimit = 3;  
        options.Window = TimeSpan.FromSeconds(10);  
    }));  

然后,将中间件添加到 HTTP 请求管道中:

app.UseRateLimiter();  

现在,我们可以使用 RateLimitAttribute 特性将速率限制器应用于控制器的操作方法,如下所示:

[HttpGet(Name = "GetWeatherForecast")]  
[EnableRateLimiting("FixedWindow")]  
public IEnumerable<WeatherForecast> Get()  

启动应用程序并尝试使用 Swagger 发送一些请求,前三个请求将被接受,但是第四个请求将被拒绝。

ASP.NET Core Web API 中间件,实现速率限制无痛接入

如果等待 10 秒钟,然后再次发送请求,我们将再次获得 3 个请求的限制。

总结

在 .NET 7 中使用速率限制中间件可以帮助我们更好地控制网络流量,提高应用程序的性能。