在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。

比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某一秒钟会达到120次请求,接着很快又会恢复正常,假设这种突发的流量不会对系统稳定性带来实质性的影响,则可以在一定程度上允许这种瞬时的突发流量,从而为用户带来更好的可用性体验。这就是令牌桶算法的用武之地。

该算法的基本原理是:有一个令牌桶,容量是x,每y单位时间会向桶中放入z个令牌,如果桶中的令牌数超过x,则丢弃令牌;请求要想通过首先需要从令牌桶中获取一个令牌,获取不到令牌则拒绝请求。可以看出对于令牌桶算法x、y、z这几个数的设定特别重要,z应该略大于绝大数时候的y单位时间内的请求数,系统会长期处于这个状态,x可以是系统允许承载的瞬时最大请求数,系统不能长时间处于这个状态。

这里介绍一个asp.net core的中间件来满足令牌桶限流需求: fireflysoft.ratelimit.aspnetcore 。使用步骤如下:

1、安装nuget包

有多种安装方式,选择自己喜欢的就行了。

包管理器命令:

或者.net命令:

或者项目文件直接添加:

2、使用中间件

在startup中使用中间件,演示代码如下(下边会有详细说明):

如上需要先注册服务,然后使用中间件。

注册服务的时候需要提供限流算法和对应的规则:

  • 这里使用进程内令牌桶算法,对于分布式服务还可以使用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 ,只不过需要自己处理限流结果。

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

到此这篇关于asp.net core中使用令牌桶限流的实现的文章就介绍到这了,更多相关asp.net core中使用令牌桶限流内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!