目录
算法原理漏检太刚算法实现进程内即内存滑动窗口算法基于Redis的滑动窗口算法应用算法1、安装Nuget包FromSeconds(5), TimeSpan.FromSeconds(1)) { ExtractTarget = context => { // 提取限流目标 return (context as HttpContext).Request.Path.Value; }, CheckRuleMatching = context => { // 判断当前请求是否需要限流处理 return true; }, Name="sliding window limit rule", LimitNumber=100, // 限流阈值,这里即5秒最多100次请求 } }) ); ... }public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseRateLimit(); ... }如上需要先注册服务,然后使用中间件。
注册服务的时候需要提供限流算法和对应的规则:
这里使用进程内固定窗口算法InProcessSlidingWindowAlgorithm,还可以使用RedisSlidingWindowAlgorithm,需要传入一个Redis连接。两种算法都支持同步和异步方法。 限流阈值是100,限流滑动窗口是5秒,小计数周期是1秒。 ExtractTarget用于提取限流目标,这里是每个不同的请求Path。如果有IO请求,这里还支持对应的异步方法ExtractTargetAsync。 CheckRuleMatching用于验证当前请求是否限流。如果有IO请求,这里还支持对应的异步方法CheckRuleMatchingAsync。 默认被限流时会返回HttpStatusCode 429,可以在AddRateLimit时使用可选参数error自定义这个值,以及Http Header和Body中的内容。基本的使用就是上边例子中的这些了。
如果还是基于传统的.NET Framework,则需要在Application_Start中注册一个消息处理器RateLimitHandler,算法和规则部分都是共用的,具体可以看github上的使用说明:https://github.com/bosima/FireflySoft.RateLimit
FireflySoft.RateLimit 是一个基于 .NET Standard 的限流类库,其内核简单轻巧,能够灵活应对各种需求的限流场景。
其主要特点包括:
多种限流算法:内置固定窗口、滑动窗口、漏桶、令牌桶四种算法,还可自定义扩展。 多种计数存储:目前支持内存、Redis两种存储方式。 分布式友好:通过Redis存储支持分布式程序统一计数。 限流目标灵活:可以从请求中提取各种数据用于设置限流目标。 支持限流惩罚:可以在客户端触发限流后锁定一段时间不允许其访问。 动态更改规则:支持程序运行时动态更改限流规则。 自定义错误:可以自定义触发限流后的错误码和错误消息。 普适性:原则上可以满足任何需要限流的场景。Github开源地址:https://github.com/bosima/FireflySoft.RateLimit








