ASP.NET Core Web API 中間件,實(shí)現(xiàn)速率限制無(wú)痛接入
什么是速率限制?
速率限制是一個(gè)用于控制特定資源在一段時(shí)間內(nèi)允許的請(qǐng)求次數(shù)的功能。
在 .NET 7 中,我們可以使用內(nèi)置的速率限制器中間件來(lái)配置與速率限制相關(guān)的設(shè)置。
那為什么要限制速率呢?
首先,通過(guò)限制網(wǎng)絡(luò)流量,我們可以幫助降低服務(wù)器和網(wǎng)絡(luò)資源使用成本。
此外,通過(guò)減少發(fā)回響應(yīng)的不必要延遲,還可以幫助我們提高應(yīng)用程序的性能。
速率限制算法
固定窗口算法是最簡(jiǎn)單的算法之一。它將請(qǐng)求限制為一個(gè)固定的時(shí)間窗口,該窗口在任何時(shí)間點(diǎn)都只允許固定數(shù)量的請(qǐng)求。
滑動(dòng)窗口算法是固定窗口算法的改進(jìn)版本,它將請(qǐng)求限制為一個(gè)可變的窗口,該窗口在任何時(shí)間點(diǎn)都只允許固定數(shù)量的請(qǐng)求。
令牌桶算法使用固定大小的令牌桶來(lái)限制請(qǐng)求的速率。令牌桶最初被填滿(mǎn)了指定數(shù)量的令牌。每次請(qǐng)求都會(huì)消耗一個(gè)令牌,如果令牌桶中沒(méi)有令牌,則該請(qǐng)求會(huì)被拒絕。
并發(fā)算法是一種非常簡(jiǎn)單的算法,它只允許固定數(shù)量的并發(fā)請(qǐng)求,但是不限制一段時(shí)間內(nèi)的請(qǐng)求數(shù)。
在 .NET 7 中使用速率限制中間件
在 ASP.NET Core Web API 項(xiàng)目中使用速率限制中間件非常簡(jiǎn)單。
首先,在 Program.cs 中添加以下代碼,使用固定窗口算法,它將在任何給定的時(shí)間窗口內(nèi)只允許固定數(shù)量的請(qǐng)求:
builder.Services.AddRateLimiter(p => p
.AddFixedWindowLimiter(policyName: "FixedWindow", options =>
{
options.PermitLimit = 3;
options.Window = TimeSpan.FromSeconds(10);
}));
然后,將中間件添加到 HTTP 請(qǐng)求管道中:
app.UseRateLimiter();
現(xiàn)在,我們可以使用 RateLimitAttribute 特性將速率限制器應(yīng)用于控制器的操作方法,如下所示:
[HttpGet(Name = "GetWeatherForecast")]
[EnableRateLimiting("FixedWindow")]
public IEnumerable<WeatherForecast> Get()
啟動(dòng)應(yīng)用程序并嘗試使用 Swagger 發(fā)送一些請(qǐng)求,前三個(gè)請(qǐng)求將被接受,但是第四個(gè)請(qǐng)求將被拒絕。

如果等待 10 秒鐘,然后再次發(fā)送請(qǐng)求,我們將再次獲得 3 個(gè)請(qǐng)求的限制。
總結(jié)
在 .NET 7 中使用速率限制中間件可以幫助我們更好地控制網(wǎng)絡(luò)流量,提高應(yīng)用程序的性能。

