广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NET Core中使用令牌桶限流的实现
  • 512
分享到

ASP.NET Core中使用令牌桶限流的实现

2024-04-02 19:04:59 512人浏览 泡泡鱼
摘要

在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。 比如限流每秒100次请求,绝大多数的时间里都不会超过

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

比如限流每秒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 ,只不过需要自己处理限流结果。

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

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

--结束END--

本文标题: ASP.NET Core中使用令牌桶限流的实现

本文链接: https://www.lsjlt.com/news/123608.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core中使用令牌桶限流的实现
    在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。 比如限流每秒100次请求,绝大多数的时间里都不会超过...
    99+
    2022-11-12
  • PHP怎么实现令牌桶限流
    小编给大家分享一下PHP怎么实现令牌桶限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP实现令牌桶限流的方法:1、设有一个令牌桶,桶内存放令牌;2、每次访问...
    99+
    2023-06-25
  • PHP如何实现令牌桶限流
    本文操作环境:Windows7系统、PHP7.1、Dell G3电脑。PHP如何实现令牌桶限流?php 基于redis使用令牌桶算法实现流量控制本文介绍php基于redis,使用令牌桶算法,实现访问流量的控制,提供完整算法说明及演示实例,方...
    99+
    2014-12-14
    PHP 令牌桶限流
  • Go 基于令牌桶的限流器实现
    目录简介 原理概述具体实现原理 限流器如何限流 简介 如果一般流量过大,下游系统反应不过来,这个时候就需要限流了,其实和上地铁是一样的,就是减慢上游访问下游的速度。 限制访问服务的...
    99+
    2022-11-12
  • Golang限流库、漏桶和令牌桶如何使用
    本篇内容主要讲解“Golang限流库、漏桶和令牌桶如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang限流库、漏桶和令牌桶如何使用”吧!RateLimit 限流中间件为什么需要限流...
    99+
    2023-07-05
  • 解决ASP.NET Core中使用漏桶算法限流的问题
    目录算法原理算法实现进程内即内存漏桶算法基于Redis的漏桶算法应用算法1、安装Nuget包2、使用中间件漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说...
    99+
    2022-11-12
  • go语言中的限流漏桶和令牌桶库怎么使用
    这篇文章主要介绍了go语言中的限流漏桶和令牌桶库怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言中的限流漏桶和令牌桶库怎么使用文章都会有所收获,下面我们一起来看看吧。为什么需要限流中间件?在大数据...
    99+
    2023-07-05
  • 如何解决ASP.NET Core中使用漏桶算法限流的问题
    这篇文章主要介绍了如何解决ASP.NET Core中使用漏桶算法限流的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。漏桶算法是限流的四大主流算法之一,其应用场景...
    99+
    2023-06-25
  • 一文聊聊go语言中的限流漏桶和令牌桶库
    本篇文章带大家聊聊go语言中的限流漏桶和令牌桶库,介绍令牌桶和漏桶的实现原理以及在实际项目中简单应用。为什么需要限流中间件?在大数据量高并发访问时,经常会出现服务或接口面对大量的请求而导致数据库崩溃的情况,甚至引发连锁反映导致整个系统崩溃。...
    99+
    2023-05-14
    Golang go语言
  • Spring Cloud Gateway中的令牌桶限流算法实例分析
    这篇“Spring Cloud Gateway中的令牌桶限流算法实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一...
    99+
    2023-06-29
  • 浅析Spring Cloud Gateway中的令牌桶限流算法
    目录前言回顾限流算法计数器/时间窗口法漏桶法令牌桶法主要逻辑分析 前言 在一个分布式高并发的系统设计中,限流是一个不可忽视的功能点。如果不对系统进行有效的流量访问限制,在双十一和抢票...
    99+
    2022-11-13
  • springboot+redis 实现分布式限流令牌桶的示例代码
    1、前言 网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手...
    99+
    2022-11-12
  • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现
    起因: 近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力。 一、AspNetCoreRa...
    99+
    2022-11-11
  • ASP.NET Core中间件实现限流的代码
    目录一、限流算法1.计数器算法1.1 固定窗口算法1.2 滑动窗口算法2.令牌桶算法3.漏桶算法二、ASP.NET Core中间件实现限流1.中间件代码2.在管道中的使用一、限流算法...
    99+
    2022-11-13
  • ASP.NET Core中间件怎么实现限流
    本篇内容介绍了“ASP.NET Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中...
    99+
    2023-06-29
  • 使用Redis实现令牌桶算法原理解析
    在限流算法中有一种令牌桶算法,该算法可以应对短暂的突发流量,这对于现实环境中流量不怎么均匀的情况特别有用,不会频繁的触发限流,对调用方比较友好。 例如,当前限制10qps,大多数情况...
    99+
    2022-11-12
  • ASP.NET Core基于滑动窗口实现限流控制的方法
    今天小编给大家分享一下ASP.NET Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • ASP.NET Core使用固定窗口限流的方法是什么
    这篇文章主要讲解了“ASP.NET Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core使用固定窗口限流的方法是什么...
    99+
    2023-06-22
  • ASP.NET Core中使用滑动窗口限流的问题举例分析
    本篇内容主要讲解“ASP.NET Core中使用滑动窗口限流的问题举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET Core中使用滑动窗口限流的问题举例分...
    99+
    2023-06-22
  • ASP.NET Core中使用滑动窗口限流的问题及场景分析
    目录算法原理漏检太刚算法实现进程内即内存滑动窗口算法基于Redis的滑动窗口算法应用算法1、安装Nuget包2、使用中间件滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作