如何使用速率限制算法在ASP。网络核心

学习如何使用固定窗,滑动窗口,令牌桶,并发算法在ASP。网络核心7保护您的应用程序和api对恶意攻击或过度使用。

  • 在Facebook上分享
  • 在Twitter上分享
  • 分享在LinkedIn
  • 在Reddit分享
  • 通过电子邮件分享
  • 印刷资源
漏水的水龙头范。Damme CC 2.0通过Flickr
范Damme2.0 (CC)

速度限制技术用于限制请求允许特定资源的数量在一个特定的时间窗口阻止DDoS攻击和API的虐待。率达到限制阈值时,后续请求的资源是不允许,推迟,或压制。

在以前的一篇文章中,我讨论了如何开始新率限制了中间件在ASP。网络核心7。在这篇文章中,我将研究四种不同速度限幅算法可以在ASP。网络核心7:固定窗,滑动窗口,令牌桶和并发性。

使用本文中提供的代码示例,您应该Visual Studio 2022安装在您的系统。如果你不已经有一个副本,你可以在这里下载Visual Studio 2022

创建一个ASP。网络核心minimal Web API project in Visual Studio 2022

首先,让我们创建一个ASP。网络核心7minimal Web API project in Visual Studio 2022. Follow these steps:

  1. 启动Visual Studio 2022 IDE。
  2. 点击“创建新项目。”
  3. 在“创建新项目”窗口中,选择“ASP。网络核心Web API” from the list of templates displayed.
  4. 单击Next。
  5. 在“配置您的新项目”窗口中,指定新项目的名称和位置。
  6. (可选)检查“解决方案和项目在同一个目录”复选框,根据您的喜好。
  7. 单击Next。
  8. 接下来,所示的“其他信息”窗口中选择“网络7.0(当前)”作为框架。取消选中该复选框,表示“使用控制器…”在这个例子中我们将使用最小的api。离开“验证类型”设置为“无”(默认)。
  9. 确保复选框“使码头工人”,“为HTTPS,配置”和“使开放的API支持”都不。我们不会使用这些特性。
  10. 单击Create。

我们将使用ASP。网络核心7Web API project to create a minimal API and implement the four different rate limiter algorithms in the sections below.

在ASP中实现一个控制器。网络核心7

让我们实现一个控制器来演示如何率限制在ASP。净的核心。要做到这一点,选择项目的控制器解决方案文件夹,然后单击Add - >控制器。选择“API控制器——空”模板从模板显示在列表中添加脚手架窗口并输入一个名称当提示的控制器。然后用以下代码替换默认的。

(路线(“api /(控制器)”)][ApiController]公开课DefaultController: ControllerBase {[HttpGet]公共字符串(){返回“Hello World”;}(HttpGet (“{id}”)]公共字符串(int id){返回$ " id的值是:{id}”;}}

在ASP RateLimiter抽象基类。网络核心7

在ASP。网络核心7,rate limiting was available as part of the Microsoft.AspNetCore.RateLimiting namespace. Rate limiting in ASP.NET Core 7 is now available as part of the System.Threading.RateLimiting namespace.

抽象基类的主要类型是RateLimiter,几个惊人的特性。RateLimiter抽象类是这样的:

公共抽象类RateLimiter: IAsyncDisposable IDisposable{公共抽象RateLimiterStatistics ?GetStatistics ();公共抽象的时间间隔?IdleDuration{得到;}公共RateLimitLease AttemptAcquire (int permitCount = 1);保护文摘RateLimitLease AttemptAcquireCore (int permitCount);公共ValueTask < RateLimitLease > AcquireAsync (int permitCount = 1, CancellationToken CancellationToken =默认);保护文摘ValueTask < RateLimitLease > AcquireAsyncCore (int permitCount, CancellationToken CancellationToken);保护虚拟空间处理(bool处理);公共空间处理(); protected virtual ValueTask DisposeAsyncCore(); public async ValueTask DisposeAsync(); }

注意,只有方法声明提供了。简洁的方法定义被省略了。

配置速度限制在ASP。网络核心7

配置速度限制了中间件在ASP。网络核心7,你使用AddRateLimiter方法。添加率限制中间件ASP。网络核心7application, you first add the required services to the container as shown in the code snippet given below.

builder.Services。AddRateLimiter(选项= >{/ /编写代码配置中间件在这里});

中间件添加到管道,你调用UseRateLimiter扩展方法如下所示。

app.UseRateLimiter ();

您可以配置RateLimiter几个选项,包括允许的最大请求数、响应状态代码,一个时间窗口。您还可以定义的速率限制基于HTTP方法,客户端IP地址,和其他因素。此外,您可以请求队列,而不是排斥它们。

速度限幅算法在ASP。网络核心7

System.Threading。RateLimiting包提供支持以下算法模型:

  • 固定窗
  • 滑动窗口
  • 令牌桶
  • 并发性

固定窗

固定窗口算法允许固定数量的请求在一个特定的时间窗口,和所有后续请求。根据病原反应要求,该算法将时间划分为固定窗。例如,假设您希望允许10每分钟的请求。一旦达到此限制,后续请求将被拒绝,直到窗口重置。

下面的代码片段展示了如何配置程序中固定窗速率限制器。在ASP cs文件。网络核心7。

builder.Services。AddRateLimiter(选项= >{选项。RejectionStatusCode = 429;选项。AddFixedWindowLimiter (policyName:“固定”,选项= >{选项。PermitLimit = 3;选项。窗口= TimeSpan.FromSeconds (10);选项。AutoReplenishment = true;选项。QueueProcessingOrder = QueueProcessingOrder.OldestFirst; options.QueueLimit = 2; }); });

AddLimiter方法用于病原服务添加到服务容器。AddFixedWindowLimiter方法用于添加一个固定的窗口政策。在这里指定的政策的名字是“固定”。注意PermitLimit和窗口属性的值。通过设置PermitLimit 3和窗口10,你允许最多三个请求每10秒。

当您运行应用程序和调用端点比允许的限制,更频繁的HTTP状态码503默认将返回“服务不可用”。简单地改变RejectionStatusCode返回一个不同的状态码。在上面的示例中,RejectionStatusCode属性设置为返回的HTTP状态码429“太多的请求。”

此外,QueueProcessingOrder被指定为OldestFirst, QueueLimit设置为2。因此,随后的两个请求将被压制和储存在一个队列每当窗口超过限制。然后最古老的请求将从队列中挑选和加工。

滑动窗口

固定窗,滑动窗口算法允许每时间窗口固定数量的请求。所不同的是,一个滑动窗口将时间窗口划分为段。每间隔一段,窗口由一个段幻灯片。

段间隔等于窗口时间除以每个窗口的段数。如果你的窗户是60秒,你指定两个部分,将幻灯片每30秒的时间窗口。

下面的代码片段说明了如何配置的滑动窗口的速度限制器程序。在ASP cs文件。网络核心7。

builder.Services。AddRateLimiter(选项= >{选项。RejectionStatusCode = 429;选项。AddSlidingWindowLimiter (policyName:“滑动”,选项= >{选项。PermitLimit = 30;选项。窗口= TimeSpan.FromSeconds (60);选项。SegmentsPerWindow = 2;选项。QueueProcessingOrder = QueueProcessingOrder.OldestFirst; options.QueueLimit = 2; }); });

SegmentsPerWindow属性用于指定段的数量的时间窗口。

令牌桶

在令牌桶算法中,每个桶中的令牌代表一个请求。一个令牌从桶中移除请求时。如果桶变成空,下一个请求被拒绝或限制。随着时间的流逝,这些桶药在一个固定利率。

考虑一个例子:一个水桶的限制10令牌。请求时,一个令牌,将服务和令牌的请求数减少。如果超过限制令牌并没有令牌,请求将被拒绝或限制。

以下代码示例展示了如何配置程序中的令牌速度限制器。在ASP cs文件。网络核心7。

builder.Services。AddRateLimiter(选项= >{选项。RejectionStatusCode = 429;选项。AddTokenBucketLimiter (policyName:“令牌”,选项= >{选项。TokenLimit = 2;选项。QueueProcessingOrder = QueueProcessingOrder.OldestFirst;选项。QueueLimit = 2;选项。ReplenishmentPeriod = TimeSpan.FromSeconds (10); options.TokensPerPeriod = 2; options.AutoReplenishment = true; }); });

TokenLimit属性指定的最大数量的令牌桶可以存储在任何给定的时间。

并发性

并发限制器控制对资源的同时发生的请求的最大数量。如果你设定一个限制的,例如,只有前10的请求将被授予访问资源在给定的时间点。当一个请求完成后,打开一个新请求。

下面的代码片段展示了如何配置ASP的并发率限制器。网络核心7。

builder.Services。AddRateLimiter(选项= >{选项。RejectionStatusCode = 429;选项。AddConcurrencyLimiter (policyName:“并发”,选项= >{选项。PermitLimit = 3;选项。QueueProcessingOrder = QueueProcessingOrder.OldestFirst;选项。QueueLimit = 2;});});

启用或禁用率限制在ASP。网络核心7

可以将速率限制应用到一个控制器,一个动作方法,或者一个剃须刀页面。[EnableRateLimiting]和[DisableRateLimiting]属性可以用来启用或禁用率限制在ASP。网络核心7。

下面的代码清单显示了如何应用“固定”速度限制器我们先前创建的DefaultController和禁用率限制在一个动作方法相同的控制器。

(路线(“api /(控制器)”)][ApiController] [EnableRateLimiting(“固定”)公开课DefaultController: ControllerBase {[HttpGet]公共字符串(){返回“Hello World”;}(HttpGet (“{id}”)] [DisableRateLimiting]公共字符串(int id){返回$ " id的值是:{id}”;}}

速度限制有许多好处。它可以保护你的应用程序或api从拒绝服务和其他恶意攻击,以及无恶意的过度使用。通过减少请求的数量在一个特定的时间窗口,从而,它还可以减少网络流量,降低基础设施成本。最后,它甚至可以改善应用程序的性能,确保公平使用可用的资源。

在后续的一篇文章关于这个主题,我将讨论如何实现自定义的速率限制政策ASP。网络核心7。

版权©2023 IDG通信公司。

奖2023年信息世界的技术。现在打开条目!