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命令:

dotnet 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,如果你的程序基于.net 4.x,可以选择这个版本。

同时在非Web应用场景也有对应的包支持:FireflySoft.RateLimit.Core ,只不过需要自己处理限流结果。

他们的使用方法都很类似,逻辑也很简单,都是需要先创建一个算法实例,然后通过这个实例去检查每一次请求,根据业务需要处理检查结果就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言怎样表示运行时间,C语言运行时间

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#define C 90000000void main(){long int i;printf(" OOOOOOO ****** ****** OOO OOO \n");for(i0;i<C;i);printf(" OOOOOOO …

10.26

1. 去掉工程中添加的新类 2. DirectUI 3. MFC 文件操作 4. http://www.cnblogs.com/jiaxiaoai/archive/2011/07/04/2097188.html 5. ATL,COM 6. 全局变量转载于:https://www.cnblogs.com/shiney/archive/2011/10/26/2224799.html

我们需要什么样的开源教育?

点击上方“开源社”关注我们| 作者&#xff1a;庄表伟| 编辑&#xff1a;沈于蓝| 设计&#xff1a;宋传琪‍文章缘起‍写这篇文章的原因&#xff0c;是和几个朋友的闲聊。再之前&#xff0c;是因为看到了几篇文章2020-12-18 《欢迎加入&#xff01;开放原子大学首批开源讲师认证…

谷歌十年,我的认知被彻底颠覆

这个问题是提给自己的&#xff0c;算是对我 Google 十年的一个小结。强调“不装逼”&#xff0c;主要是提醒自己不要陷入下列俗套&#xff1a;离职后靠黑前雇主、八卦前雇主、揭秘前雇主搏出位&#xff08;这条是恶行&#xff09;满足大众猎奇心理吹嘘自己&#xff0c;贬低他人…

重言式判别c语言中文网,重言式判别 重言式判别源码及课程设计 c语言版.doc

重言式判别 重言式判别源码及课程设计 c语言版重言式的判别 题目&#xff1a;一个逻辑表达式如果对于其変元的任一种取值都为真&#xff0c;则称为重言式&#xff1b;反之&#xff0c;如果对于其变元的任一种取值都为假&#xff0c;则称为矛盾式&#xff1b;然而&#xff0c;更…

redis灵魂拷问:19图+11题带你面试通关

又到了金三银四跳槽季&#xff0c;好多同学已经开始行动了。今天我来助力一把&#xff0c;送出这套redis面试题&#xff0c;助力大家通关。1 redis为什么响应快1.1数据保存在内存中redis数据保存在内存中&#xff0c;读写操作只要访问内存&#xff0c;不需要磁盘IO。1.2.底层数…

趣图:BAT程序员的一天对比

这是一张流传网络的BAT的一天对比图&#xff1a;你看懂了吗&#xff1f;数据与算法之美用数据解决不可能长按扫码关注

android view存储为jpg,Android长按imageview把图片保存到本地的实例代码

工具类之前用AsyncTask现在改用rxJavapublic class SaveImageUtils {public static void imageSave(final ImageView imageView, final int id) {Observable.create(new Observable.OnSubscribe() {Overridepublic void call(Subscriber super ImageView> sub) {sub.onNext(…

【配置文件】大家来谈谈这个log4j到底有什么用?

一直在WEB项目中添加log4j.properties文件&#xff0c;却不知道该怎么使用它&#xff0c;希望大家不吝赐教 写日志&#xff0c;还能干什么&#xff1f; log4j.properties 主要用于配置那些范围会采用日记的记录&#xff0c;以及日记的输出格式&#xff0c;采用什么设备输出&…

教你如何用Harbor 私有镜像仓库搭建

一、Harbor是什么&#xff1f; Docker有个形象的比喻叫集装箱&#xff0c;kubernetes是舵手&#xff0c;而Harbor是港湾&#xff0c;其实是用来保存容器镜像的仓库&#xff0c;企业使用docker、kubernetes时&#xff0c;一般都需要个私有镜像仓库的&#xff0c;Harbor就是其中的…

接好!畅销数学界的科普书,我们免费送!

感谢一直以来的关注与支持一直以来感谢大家对超级数学建模的关注与支持&#xff01;我们热爱数学&#xff0c;对于数学的可爱、魅力以及神秘&#xff0c;我们也与大家一起探索&#xff01;我们也热爱分享&#xff0c;把每一次的数学趣味、专业知识分享给大家&#xff01;此时此…

android 监听布局改变,Android通过监听最外层布局的改变监听键盘的状态,软键盘的弹出和收起都会改变外层布局(前提是把Activity的mode设置成压缩);...

最外层布局.addOnLayoutChangeListener(new OnLayoutChangeListener() {Overridepublic void onLayoutChange(View arg0, int arg1, int arg2, int arg3,int arg4, int arg5, int arg6, int arg7, int arg8) {// TODO Auto-generated method stubif(EditText.hasFocus()){/*** …

仿豆丁百度文库网页版阅读器完整解决方案

Java平台要实现类似豆丁百度文科的文档在线阅读&#xff0c;总体思路是讲doc docx等文件格式利用openoffice转换成pdf再用swftools转为swf。再用flexpaper组件显示swf。 此过程涉及软件(实测) openoffice3.2(window) swftools-2011-01-23-1815.exe(window) openoffice3.1.1(lin…

NET问答: 如何使用 C# 自动化关闭电脑 ?

咨询区 roomaroo&#xff1a;我查阅资料发现有一些可使用 C# 关闭用户电脑的方法&#xff0c;但我觉得都不是很简洁&#xff0c;所以我想在这里寻找一种简单或者使用原生 .NET 关闭的方式。回答区 Pop Catalin&#xff1a;很简单&#xff0c;直接用 C# 调用 cmd 执行 shutdown …

这表白代码让我虎躯一震!

大家都见过哪些让你虎躯一震的代码&#xff1f;就是瞬间让你怀疑人生的那种靠着这个代码成功脱单........那天边和自己喜欢的姑娘聊天 边刷微博&#xff0c;碰巧就刷到了这个图&#xff0c;结果当时脑袋一热就给人发过去了&#xff0c;但没想到对方直接就同意啦哈哈哈哈至于现在…

android cpp做成so库,android so库、jar包生成和使用

搞了很久的Android开发了&#xff0c;一直在使用别人(第三方的sdk)&#xff0c;所以今天突发奇想&#xff0c;自己搞一个NDK项目提供给其他app使用。本篇文章就从ndk环境到SDK生成、使用一起说说。废话 不多少开始动起来吧&#xff01;&#xff01;一、Android studio ndk环境点…

菜鸟修炼C语言小设计之——工资统计

本设计完成一个工资统计的小设计&#xff0c;涉及的C语言重点知识有&#xff1a; 1&#xff0c;结构体 2&#xff0c;结构体指针数组 3&#xff0c;枚举类型 1.1 设计题目 本课程设计要求设计一个公司职员的数据结构&#xff0c;并使用结构指针数组存储职员信息&#xff0c;统计…

AgileConfig - 轻量级配置中心1.2.0发布,全新的UI

AgileConfig自发布以来有个“大问题”-UI太丑。因为当初这个项目是给自己用的&#xff0c;连UI界面都没有&#xff0c;全靠手动在数据库里改配置。后来匆匆忙忙使用bootstrap3简单的码了一些界面就发布出来了&#xff0c;易用性上也做的不够好。对此我一直耿耿于怀。终于在过年…

android 无法安装测试版本,在测试应用更新时,安装无提示阻止Android版本构建签名APK...

当我尝试更新我的应用程序(在已经从playstore安装的应用程序上手动安装带有更高版本的已签名APK)时,它未被安装(“应用程序未安装“)并在Studio中显示以下错误&#xff1a;I/Finsky: [1144] com.google.android.finsky.verifier.impl.en.c(263): Verifying id8,result-1I/Finsk…

如何解开机器学习的面纱?

目前&#xff0c;人工智能的应用日渐广泛。而作为人工智能核心的机器学习&#xff0c;是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…