iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET Core使用固定窗口限流的方法是什么
  • 678
分享到

ASP.NET Core使用固定窗口限流的方法是什么

2023-06-22 00:06:58 678人浏览 安东尼
摘要

这篇文章主要讲解了“asp.net Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.net Core使用固定窗口限流的方法是什么

这篇文章主要讲解了“asp.net Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.net Core使用固定窗口限流的方法是什么”吧!

算法原理

固定窗口算法又称计数器算法,是一种简单的限流算法。在单位时间内设定一个阈值和一个计数值,每收到一个请求则计数值加一,如果计数值超过阈值则触发限流,如果达不到则请求正常处理,进入下一个单位时间后,计数值清零,重新累计。

ASP.NET Core使用固定窗口限流的方法是什么

如上图所示,时间单位是1秒,阈值是3。

  • 第1秒3个请求,不会触发限流;

  • 第2秒1个请求,不会触发限流;

  • 第3秒4个请求,这一秒的前3个请求正常处理,第4个请求触发限流,会被拒绝处理。

  • 后续第4秒、第5秒不会触发限流,所有请求正常处理。

算法实现

这里讲两种实现方法:进程内即内存固定窗口算法、基于Redis的固定窗口算法。

进程内即内存固定窗口算法

使用字典,Key是限流目标,Value包括计数值和过期时间。处理请求时,首先从请求中提取限流目标,然后根据限流目标去字典中查找,如果不存在,则添加一个字典项,计数值是1,过期时间是当前时间+限流单位时间;如果存在,则检查是否过期,如果过期,则计数值归1,过期时间是当前时间+限流单位时间,如果未过期,则仅计数值加1。这里需要注意多线程问题,读写数据时需要加

C#语言中可以使用MemoryCache,它的缓存项有一个过期时间,不需要自己回收过期的项目

进程内计数的方法最适合单实例处理的程序限流,多实例处理的情况下可能每个实例收到的请求数不均匀,不能保证限流效果。

基于Redis的固定窗口算法

Redis作为KV存储,类似于字典,而且也自带过期时间。处理请求时,首先从请求中提取限流目标,然后根据限流目标去Redis中查找,如果不存在,则添加KV项,Value值是1,过期时间是当前时间+限流单位时间;如果存在,则Value值加1。

这些操作逻辑可以封装在一个lua script中,因为Lua script在Redis中执行时也是原子操作,所以Redis的限流计数在分布式处理时天然就是准确的。

算法应用

这里以限流组件 FireflySoft.RateLimit 为例,实现ASP.net core中的固定窗口限流。

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 InProcessFixedWindowAlGorithm(                new[] {                    new FixedWindowRule()                    {                        ExtractTarget = context =>                        {                        // 提取限流目标                            return (context as HttpContext).Request.Path.Value;                        },                        CheckRuleMatching = context =>                        {                        // 判断当前请求是否需要限流处理                            return true;                        },                        Name="fixed window limit rule",                        LimitNumber=30, // 限流阈值                        StatWindow=TimeSpan.FromSeconds(1) // 限流单位时间                    }                })            );            ...        }public void Configure(IApplicationBuilder app, IWEBHostEnvironment env)        {            ...            app.UseRateLimit();            ...        }

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

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

  • 这里使用进程内固定窗口算法InProcessFixedWindowAlgorithm,还可以使用RedisFixedWindowAlgorithm,需要传入一个Redis连接。

  • 限流阈值是30,限流单位时间是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#aspnet

FireflySoft.RateLimit 是一个基于 .NET Standard 的限流类库,其内核简单轻巧,能够灵活应对各种需求的限流场景。

其主要特点包括:

  • 多种限流算法:内置固定窗口、滑动窗口、漏桶、令牌桶四种算法,还可自定义扩展。

  • 多种计数存储:目前支持内存、Redis两种存储方式。

  • 分布式友好:通过Redis存储支持分布式程序统一计数。

  • 限流目标灵活:可以从请求中提取各种数据用于设置限流目标。

  • 支持限流惩罚:可以在客户端触发限流后锁定一段时间不允许其访问。

  • 动态更改规则:支持程序运行时动态更改限流规则。

  • 自定义错误:可以自定义触发限流后的错误码和错误消息。

  • 普适性:原则上可以满足任何需要限流的场景。

感谢各位的阅读,以上就是“ASP.NET Core使用固定窗口限流的方法是什么”的内容了,经过本文的学习后,相信大家对ASP.NET Core使用固定窗口限流的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: ASP.NET Core使用固定窗口限流的方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • ASP.NET Core使用固定窗口限流的方法是什么
    这篇文章主要讲解了“ASP.NET Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core使用固定窗口限流的方法是什么...
    99+
    2023-06-22
  • ASP.NET Core使用固定窗口限流
    目录算法原理算法实现进程内即内存固定窗口算法基于Redis的固定窗口算法算法应用1、安装Nuget包2、使用中间件算法原理 固定窗口算法又称计数器算法,是一种简单的限流算法。在单位时...
    99+
    2024-04-02
  • 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中使用滑动窗口限流的问题及场景分析
    目录算法原理漏检太刚算法实现进程内即内存滑动窗口算法基于Redis的滑动窗口算法应用算法1、安装Nuget包2、使用中间件滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更...
    99+
    2024-04-02
  • 解决ASP.NET Core中使用漏桶算法限流的问题
    目录算法原理算法实现进程内即内存漏桶算法基于Redis的漏桶算法应用算法1、安装Nuget包2、使用中间件漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说...
    99+
    2024-04-02
  • oracle窗口函数的使用方法是什么
    在Oracle数据库中,窗口函数是一种用于执行聚合、排序、排名等操作的特殊函数。窗口函数不会合并行,而是在查询结果的每一行上执行计算...
    99+
    2024-04-09
    oracle
  • wpf子窗口调用主窗口的方法是什么
    在WPF中,子窗口可以通过以下几种方式调用主窗口的方法:1. 通过子窗口的Owner属性获取到主窗口的实例,然后直接调用主窗口的方法...
    99+
    2023-08-16
    wpf
  • 如何解决ASP.NET Core中使用漏桶算法限流的问题
    这篇文章主要介绍了如何解决ASP.NET Core中使用漏桶算法限流的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。漏桶算法是限流的四大主流算法之一,其应用场景...
    99+
    2023-06-25
  • asp.net OleDbCommand的使用方法是什么
    在ASP.NET中使用OleDbCommand主要用于执行针对OleDb数据库的SQL语句或存储过程。 以下是使用OleDbComm...
    99+
    2024-04-02
  • excel2007冻结窗口的方法是什么
    在Excel 2007中,冻结窗口的方法如下:1. 选中需要冻结的行或列,或者选中需要冻结的单元格。2. 在“视图”选项卡的“窗口”...
    99+
    2023-06-17
    excel2007冻结窗口 excel
  • eclipse重置窗口的方法是什么
    在Eclipse中重置窗口的方法是通过以下步骤操作: 打开Eclipse软件,确保已经打开了需要重置窗口的工作区。 转到菜单...
    99+
    2024-04-02
  • JavaScript窗口对象的方法是什么
    这篇文章主要讲解了“JavaScript窗口对象的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript窗口对象的方法是什么”吧! ...
    99+
    2024-04-02
  • ASP.NET MVC框架的使用方法是什么
    ASP.NET MVC框架的使用方法如下:1. 创建ASP.NET MVC项目:打开Visual Studio,选择“创建新项目”,...
    99+
    2023-10-10
    ASP.NET MVC
  • win10游戏窗口化的方法是什么
    要将Windows 10中的游戏窗口化,您可以尝试以下方法:1. 使用游戏内设置:某些游戏在其设置中提供了窗口化选项。您可以在游戏内...
    99+
    2023-09-12
    win10
  • mfc创建子窗口的方法是什么
    MFC(Microsoft Foundation Classes)创建子窗口的方法是通过调用CWnd类的Create函数来实现的。具...
    99+
    2023-09-21
    mfc
  • Springboot使用redis实现接口Api限流的方法
    这篇文章主要介绍“Springboot使用redis实现接口Api限流的方法”,在日常操作中,相信很多人在Springboot使用redis实现接口Api限流的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-20
  • javascript设置固定时间的方法是什么
    这篇文章主要介绍“javascript设置固定时间的方法是什么”,在日常操作中,相信很多人在javascript设置固定时间的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • java设置窗口大小的方法是什么
    在Java中,可以使用`setSize()`方法来设置窗口的大小。以下是一些示例代码:```javaimport javax.swi...
    99+
    2023-10-07
    java
  • win10快速切换窗口的方法是什么
    在Windows 10中,有几种快速切换窗口的方法:1. 使用快捷键Alt + Tab:按住Alt键并连续按Tab键,可以在打开的窗...
    99+
    2023-08-22
    win10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作