iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET Core中间件怎么实现限流
  • 460
分享到

ASP.NET Core中间件怎么实现限流

2023-06-29 08:06:11 460人浏览 安东尼
摘要

本篇内容介绍了“asp.net Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中

本篇内容介绍了“asp.net Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、限流算法

    高并发系统中,有三把利器用来保护系统:缓存、降级和限流。

    本文主要是介绍限流,限流算法主要有以下三种:

    1.计数器算法

    • 固定窗口

    • 滑动窗口

    令牌桶算法

    漏桶算法

    计数器算法

    1.1 固定窗口算法

    计数器算法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开 始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter。

    java中的具体实现如下:

    public class CounterTest {    public long timeStamp = getNowTime();    public int reqCount = 0;    public final int limit = 100; // 时间窗口内最大请求数    public final long interval = 1000; // 时间窗口ms    public boolean grant() {        long now = getNowTime();        if (now < timeStamp + interval) {            // 在时间窗口内            reqCount++;            // 判断当前时间窗口内是否超过最大请求控制数            return reqCount <= limit;        } else {            timeStamp = now;            // 超时后重置            reqCount = 1;            return true;        }    }    public long getNowTime() {        return System.currentTimeMillis();    }}

    .NET Core中的具体实现如下:

    AspnetcoreRateLimit是目前ASP.net core下最常用的限流解决方案,AspNetCoreRateLimit的源码实现是固定窗口算法如下:

    var entry = await _counterStore.GetAsync(counterId, cancellationToken);if (entry.HasValue){    // entry has not expired    if (entry.Value.Timestamp + rule.PeriodTimespan.Value >= DateTime.UtcNow)    {        // increment request count        var totalCount = entry.Value.Count + _config.RateIncrementer?.Invoke() ?? 1;        // deep copy        counter = new RateLimitCounter        {            Timestamp = entry.Value.Timestamp,            Count = totalCount        };    }}

    固定窗口算法缺点

    ASP.NET Core中间件怎么实现限流

    从上图中我们可以看到,假设有一个恶意用户,他在0:59时,瞬间发送了100个请求,并且1:00又瞬间发送了100个请求,那么其实这个用户在 1秒里面,瞬间发送了200个请求。我们刚才规定的是1分钟最多100个请求,也就是每秒钟最多1.7个请求,用户通过在时间窗口的重置节点处突发请求, 可以瞬间超过我们的速率限制。用户有可能通过算法的这个漏洞,瞬间压垮我们的应用。

    1.2 滑动窗口算法

    滑动窗口类似于固定窗口算法,但它通过将前一个窗口中的加权计数添加到当前窗口中的计数来计算估计数,如果估计数超过计数限制,则请求将被阻止。

    具体公式如下:

    估计数 = 前一窗口计数 * (1 - 当前窗口经过时间 / 单位时间) + 当前窗口计数

    ASP.NET Core中间件怎么实现限流

    窗口[00:00, 00:01)中有9个请求,窗口[00:01, 00:02)中有5个请求。对于01:15到达的请求,即窗口[00:01, 00:02)的25%位置,通过公式计算请求计数:9 x (1 - 25%) + 5 = 11.75 > 10. 因此我们拒绝此请求。

    即使两个窗口都没有超过限制,请求也会被拒绝,因为前一个和当前窗口的加权和确实超过了限制。

    2.令牌桶算法

    令牌桶算法是比较常见的限流算法之一,大概描述如下:
    1)所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
    2)根据限流大小,设置按照一定的速率往桶里添加令牌;
    3)桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
    4)请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
    5)令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;

    ASP.NET Core中间件怎么实现限流

    3.漏桶算法

    漏桶算法其实很简单,可以粗略的认为就是注水漏水过程,往桶中以一定速率流出水,以任意速率流入水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。

    ASP.NET Core中间件怎么实现限流

    二、ASP.net core中间件实现限流

    1.中间件代码

    public class SlidingWindow{    private readonly object _syncObject = new object();    private readonly int _requestIntervalSeconds;    private readonly int _requestLimit;    private DateTime _windowstartTime;    private int _prevRequestCount;    private int _requestCount;    public SlidingWindow(int requestLimit, int requestIntervalSeconds)    {        _windowStartTime = DateTime.Now;        _requestLimit = requestLimit;        _requestIntervalSeconds = requestIntervalSeconds;    }    public bool PassRequest()        lock (_syncObject)        {            var currentTime = DateTime.Now;            var elapsedSeconds = (currentTime - _windowStartTime).TotalSeconds;            if (elapsedSeconds >= _requestIntervalSeconds * 2)            {                _windowStartTime = currentTime;                _prevRequestCount = 0;                _requestCount = 0;                elapsedSeconds = 0;            }            else if (elapsedSeconds >= _requestIntervalSeconds)                _windowStartTime = _windowStartTime.AddSeconds(_requestIntervalSeconds);                _prevRequestCount = _requestCount;                elapsedSeconds = (currentTime - _windowStartTime).TotalSeconds;            }             var requestCount = _prevRequestCount * (1 - elapsedSeconds / _requestIntervalSeconds) + _requestCount + 1;            if (requestCount <= _requestLimit)                _requestCount++;                return true;        }        return false;}

    如果最近的2次请求相距2个窗口时间,则可以认为前一窗口计数为0,重新开始计数。

    public class RateLimitMiddleware : IMiddleware{    private readonly SlidingWindow _window;    public RateLimitMiddleware()    {        _window = new SlidingWindow(10, 60);    }    public async Task InvokeAsync(HttpContext context, RequestDelegate next)    {        if (!_window.PassRequest())        {            context.SetEndpoint(new Endpoint((context) =>            {                context.Response.StatusCode = StatusCodes.Status403Forbidden;                return Task.CompletedTask;            },                        EndpointMetadataCollection.Empty,                        "限流"));        }        await next(context);    }}

    2.在管道中的使用

    需要注意的是,我们注册Middleware时,必须使用单例模式,保证所有请求通过同一SlidingWindow计数:

    services.AddSingleton<RateLimitMiddleware>();

    “ASP.net Core中间件怎么实现限流”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: ASP.NET Core中间件怎么实现限流

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

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

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

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

    下载Word文档
    猜你喜欢
    • ASP.NET Core中间件怎么实现限流
      本篇内容介绍了“ASP.NET Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中...
      99+
      2023-06-29
    • ASP.NET Core中间件实现限流的代码
      目录一、限流算法1.计数器算法1.1 固定窗口算法1.2 滑动窗口算法2.令牌桶算法3.漏桶算法二、ASP.NET Core中间件实现限流1.中间件代码2.在管道中的使用一、限流算法...
      99+
      2024-04-02
    • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现
      起因: 近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力。 一、AspNetCoreRa...
      99+
      2024-04-02
    • ASP.NET Core中使用令牌桶限流的实现
      在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。 比如限流每秒100次请求,绝大多数的时间里都不会超过...
      99+
      2024-04-02
    • ASP.NET Core中间件初始化的实现
      目录前言  自定义的方式 Use方式 基于约定的方式 实现IMiddleware的方式 源码探究 Use扩展方法 UseMiddleware 总结 前言  ...
      99+
      2024-04-02
    • ASP.NET Core中间件Middleware是什么
      本篇内容介绍了“ASP.NET Core中间件Middleware是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是中间件...
      99+
      2023-06-26
    • ASP.NET Core中间件初始化的实现方法
      小编给大家分享一下ASP.NET Core中间件初始化的实现方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言  在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,...
      99+
      2023-06-15
    • ASP.Net Core MVC中间件是什么
      本篇内容介绍了“ASP.Net Core MVC中间件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!讲中间件, 其...
      99+
      2023-06-29
    • ASP.NET Core基于滑动窗口实现限流控制
      目录前言:二、固定窗口算法三、滑动窗口算法四、实现六、使用结论:前言: 在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力...
      99+
      2024-04-02
    • 理解ASP.NET Core 中间件(Middleware)
      目录中间件中间件管道RunUseUseWhenMapMapWhenRun & Use & UseWhen & Map & Map编写中间件并激活基于约...
      99+
      2024-04-02
    • ASP.NET Core中间件如何使用
      今天小编给大家分享一下ASP.NET Core中间件如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言...
      99+
      2023-06-29
    • ASP.NET Core中怎么实现文件上传与下载
      这篇文章给大家介绍ASP.NET Core中怎么实现文件上传与下载,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.使用模型绑定上传文件(官方例子)官方机器翻译的地址:https://docs.microsoft.co...
      99+
      2023-06-19
    • .Net Core如何实现限流
      小编给大家分享一下.Net Core如何实现限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、环境vs2019.Net Core 3.1引用 AspNetCo...
      99+
      2023-06-20
    • Asp.Net Core7 preview4限流中间件新特性详解
      目录前言UseRateLimiter尝鲜本地测试ConcurrencyLimiter源码获取令牌尝试获取令牌核心逻辑令牌获取失败后进入等待队列归还令牌总结前言 限流是应对流量暴增或某...
      99+
      2024-04-02
    • ASP.NET Core基于滑动窗口实现限流控制的方法
      今天小编给大家分享一下ASP.NET Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
      99+
      2023-06-29
    • ASP.NET Core中怎么实现远程调试
      这篇文章给大家介绍ASP.NET Core中怎么实现远程调试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。体验Web Deploy这种发布方式可直接将代码打包发到指定服务器的指定站点下,十分方便。远程调试注意事项若要使...
      99+
      2023-06-19
    • ASP.NET Core MVC中怎么实现过滤器
      本篇内容介绍了“ASP.NET Core MVC中怎么实现过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器如何...
      99+
      2023-06-29
    • .Net Core限流的实现示例
      目录一、环境二、基础使用1.设置2.规则设置3.特殊规则的启用 三、请求返回头四、使用Redis存储1、访问计数 2、ip特殊规则3、客户端特殊规则 五...
      99+
      2024-04-02
    • ASP.NET Core的中间件与管道介绍
      今天来讨论一个ASP.NET Core 很重要概念管道和中间件,在ASP.NET Core中,针对HTTP请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很...
      99+
      2024-04-02
    • 怎么在ASP.Net Core中实现健康检查
      小编给大家分享一下怎么在ASP.Net Core中实现健康检查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!健康检查 常用于判断一个应用程序能否对 request...
      99+
      2023-06-14
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作