ASP.NET Core中使用令牌桶限流的实现
在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,无法应对瞬时的突发流量。
比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,偶尔某一秒钟会达到120次请求,接着很快又会恢复正常,假设这种突发的流量不会对系统稳定性带来实质性的影响,则可以在一定程度上允许这种瞬时的突发流量,从而为用户带来更好的可用性体验。这就是令牌桶算法的用武之地。
该算法的基本原理是有一个令牌桶,容量是X,每Y单位时间会向桶中放入Z个令牌,如果桶中的令牌数超过X,则丢弃令牌;请求要想通过需要从令牌桶中获取一个令牌,获取不到令牌则拒绝请求。可以看出对于令牌桶算法X、Y、Z这几个数的设定特别重要,Z应该略大于绝大数时候的Y单位时间内的请求数,系统会长期处于这个状态,X可以是系统允许承载的瞬时最大请求数,系统不能长时间处于这个状态。
这里介绍一个ASP.NET Core的中间件来满足令牌桶限流需求 FireflySoft.RateLimit.AspNetCore 。使用步骤如下
1、安装Nuget包
有多种安装方式,选择自己喜欢的就行了。
包管理器命令
Install-Package FireflySoft.RateLimit.AspNetCore
或者.NET命令:
dot add package FireflySoft.RateLimit.AspNetCore
或者项目文件直接添加
<ItemGroup> <PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="2." /> </ItemGroup>
2、使用中间件
在Startup中使用中间件,演示代码如下(下边会有详细说明)
public void ConfigureServices(IServiceCollection services) { ... app.AddRateLimit(new InProcessTokenBucketAlgorithm( new[] { new TokenBucketRule(30,10,TimeSpan.FromSeconds(1)) { ExtractTarget = context => { return (context as HttpContext).Request.Path.Value; }, CheckRuleMatching = context => { return true; }, Name="default limit rule", } }) ); ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseRateLimit(); ... }
如上需要先注册服务,然后使用中间件。
注册服务的时候需要提供限流算法和对应的规则
- 这里使用进程内令牌桶算法,对于分布式服务还可以使用Redis令牌桶算法,支持StackExchange.Redis。
- 桶的容量是30,每秒流入10个令牌。
- ExtractTarget用于提取限流目标,这里是每个不同的请求Path。如果有IO请求,这里还支持对应的异步方法ExtractTargetAsync。
- CheckRuleMatching用于验证当前请求是否限流。如果有IO请求,这里还支持对应的异步方法CheckRuleMatchingAsync。
- 默认被限流时会返回HttpStatusCode 429,可以在AddRateLimit时使用可选参数error自定义这个值,以及Http Header和Body中的内容。
- 基本的使用就是上边例子中的这些了。
这个项目也支持.Net Framework,需要安装另一个包 FireflySoft.RateLimit.AspNet ,如果你的程序基于. 4.x,可以选择这个版本。
在非Web应用场景也有对应的包支持 FireflySoft.RateLimit.Core ,只不过需要自己处理限流结果。
他们的使用方法都很类似,逻辑也很简单,都是需要先创建一个算法实例,然后通过这个实例去检查每一次请求,根据业务需要处理检查结果就可以了。
到此这篇关于ASP.NET Core中使用令牌桶限流的实现的文章就介绍到这了,更多相关ASP.NET Core中使用令牌桶限流内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程