最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET?Core中間件實現(xiàn)限流的代碼

 更新時間:2022年03月01日 14:10:58   作者:愚公搬代碼  
這篇文章主要介紹了ASP.NET?Core中間件實現(xiàn)限流的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、限流算法

在高并發(fā)系統(tǒng)中,有三把利器用來保護系統(tǒng):緩存、降級和限流。

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

1.計數(shù)器算法

  • 固定窗口
  • 滑動窗口

2.令牌桶算法

3.漏桶算法

1.計數(shù)器算法

1.1 固定窗口算法

計數(shù)器算法是限流算法里最簡單也是最容易實現(xiàn)的一種算法。比如我們規(guī)定,對于A接口來說,我們1分鐘的訪問次數(shù)不能超過100個。那么我們可以這么做:在一開 始的時候,我們可以設(shè)置一個計數(shù)器counter,每當(dāng)一個請求過來的時候,counter就加1,如果counter的值大于100并且該請求與第一個 請求的間隔時間還在1分鐘之內(nèi),那么說明請求數(shù)過多;如果該請求與第一個請求的間隔時間大于1分鐘,且counter的值還在限流范圍內(nèi),那么就重置 counter。

java中的具體實現(xiàn)如下:

public class CounterTest {
    public long timeStamp = getNowTime();
    public int reqCount = 0;
    public final int limit = 100; // 時間窗口內(nèi)最大請求數(shù)
    public final long interval = 1000; // 時間窗口ms

    public boolean grant() {
        long now = getNowTime();
        if (now < timeStamp + interval) {
            // 在時間窗口內(nèi)
            reqCount++;
            // 判斷當(dāng)前時間窗口內(nèi)是否超過最大請求控制數(shù)
            return reqCount <= limit;
        } else {
            timeStamp = now;
            // 超時后重置
            reqCount = 1;
            return true;
        }
    }

    public long getNowTime() {
        return System.currentTimeMillis();
    }
}

.NET Core中的具體實現(xiàn)如下:

AspNetCoreRateLimit是目前ASP.NET Core下最常用的限流解決方案,AspNetCoreRateLimit的源碼實現(xiàn)是固定窗口算法如下:

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
        };
    }
}

固定窗口算法缺點

在這里插入圖片描述

從上圖中我們可以看到,假設(shè)有一個惡意用戶,他在0:59時,瞬間發(fā)送了100個請求,并且1:00又瞬間發(fā)送了100個請求,那么其實這個用戶在 1秒里面,瞬間發(fā)送了200個請求。我們剛才規(guī)定的是1分鐘最多100個請求,也就是每秒鐘最多1.7個請求,用戶通過在時間窗口的重置節(jié)點處突發(fā)請求, 可以瞬間超過我們的速率限制。用戶有可能通過算法的這個漏洞,瞬間壓垮我們的應(yīng)用。

1.2 滑動窗口算法

滑動窗口類似于固定窗口算法,但它通過將前一個窗口中的加權(quán)計數(shù)添加到當(dāng)前窗口中的計數(shù)來計算估計數(shù),如果估計數(shù)超過計數(shù)限制,則請求將被阻止。

具體公式如下:

估計數(shù) = 前一窗口計數(shù) * (1 - 當(dāng)前窗口經(jīng)過時間 / 單位時間) + 當(dāng)前窗口計數(shù)

在這里插入圖片描述

窗口[00:00, 00:01)中有9個請求,窗口[00:01, 00:02)中有5個請求。對于01:15到達的請求,即窗口[00:01, 00:02)的25%位置,通過公式計算請求計數(shù):9 x (1 - 25%) + 5 = 11.75 > 10. 因此我們拒絕此請求。

即使兩個窗口都沒有超過限制,請求也會被拒絕,因為前一個和當(dāng)前窗口的加權(quán)和確實超過了限制。

2.令牌桶算法

令牌桶算法是比較常見的限流算法之一,大概描述如下:
1)所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;
2)根據(jù)限流大小,設(shè)置按照一定的速率往桶里添加令牌;
3)桶設(shè)置最大的放置令牌限制,當(dāng)桶滿時、新添加的令牌就被丟棄或者拒絕;
4)請求達到后首先要獲取令牌桶中的令牌,拿著令牌才可以進行其他的業(yè)務(wù)邏輯,處理完業(yè)務(wù)邏輯之后,將令牌直接刪除;
5)令牌桶有最低限額,當(dāng)桶中的令牌達到最低限額的時候,請求處理完之后將不會刪除令牌,以此保證足夠的限流;

在這里插入圖片描述

3.漏桶算法

漏桶算法其實很簡單,可以粗略的認為就是注水漏水過程,往桶中以一定速率流出水,以任意速率流入水,當(dāng)水超過桶流量則丟棄,因為桶容量是不變的,保證了整體的速率。

在這里插入圖片描述

二、ASP.NET Core中間件實現(xiàn)限流

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個窗口時間,則可以認為前一窗口計數(shù)為0,重新開始計數(shù)。

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計數(shù):

services.AddSingleton<RateLimitMiddleware>();

到此這篇關(guān)于ASP.NET Core中間件-限流的文章就介紹到這了,更多相關(guān)ASP.NET Core中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ASP.NET Core文件上傳與下載實例(多種上傳方式)

    ASP.NET Core文件上傳與下載實例(多種上傳方式)

    下面小編就為大家分享一篇ASP.NET Core文件上傳與下載實例(多種上傳方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • .NET Core簡單讀取json配置文件

    .NET Core簡單讀取json配置文件

    這篇文章主要為大家詳細介紹了.NET Core簡單讀取json配置文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Entity?Framework?Core實現(xiàn)Like查詢詳解

    Entity?Framework?Core實現(xiàn)Like查詢詳解

    本文詳細講解了Entity?Framework?Core實現(xiàn)Like查詢的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • aspx實現(xiàn)的 jquery ui 的 flexgrid demo

    aspx實現(xiàn)的 jquery ui 的 flexgrid demo

    這幾天沒事研究著jquery,真是個好東西,慢慢的知道了有jquery ui,一開始就被華麗的界面和簡單的操作給吸引了,尤其是里面的flexgrid,對我而言可以說是非常寶貴的東西
    2009-12-12
  • 詳解Asp.Net Core 2.1+的視圖緩存(響應(yīng)緩存)

    詳解Asp.Net Core 2.1+的視圖緩存(響應(yīng)緩存)

    本篇文章給大家通過實例講述了Asp.Net Core 2.1+的視圖緩存(響應(yīng)緩存)的相關(guān)知識點,對此有興趣的讀者們可以學(xué)習(xí)下。
    2018-03-03
  • MVC5下拉框綁定的方法(單選)

    MVC5下拉框綁定的方法(單選)

    這篇文章主要為大家詳細介紹了MVC5下拉框綁定,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 基于.NET程序默認啟動線程數(shù)講解

    基于.NET程序默認啟動線程數(shù)講解

    本篇文章小編為大家介紹,基于.NET程序默認啟動線程數(shù)講解。需要的朋友參考下
    2013-04-04
  • asp.net一些很酷很實用的.Net技巧

    asp.net一些很酷很實用的.Net技巧

    方便使用asp.net編程的朋友,都是一些非常有用的東西
    2008-08-08
  • ASP.NET中Config文件的讀寫示例

    ASP.NET中Config文件的讀寫示例

    通常我們在.NET開發(fā)過程中,會接觸二種類型的配置文件:config文件,xml文件,下面這篇文章主要給大家介紹了關(guān)于ASP.NET中Config文件讀寫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 在ASP.NET中讀寫XML數(shù)據(jù)的多種方法

    在ASP.NET中讀寫XML數(shù)據(jù)的多種方法

    在ASP.NET日常開發(fā)中,XML(可擴展標(biāo)記語言)是一種常用的數(shù)據(jù)交換格式,它被廣泛用于配置文件、數(shù)據(jù)傳輸和Web服務(wù)等場景,在.NET框架中,提供了多種類和方法來讀寫XML數(shù)據(jù),以下是對ASP.NET中讀寫XML的詳解,需要的朋友可以參考下
    2025-01-01

最新評論

宝清县| 永福县| 阿图什市| 平原县| 兰溪市| 盐池县| 和田县| 洛浦县| 义马市| 隆尧县| 黄陵县| 贡嘎县| 紫阳县| 嘉善县| 乌鲁木齐县| 义乌市| 罗甸县| 明溪县| 仲巴县| 清徐县| 峡江县| 新和县| 西乌珠穆沁旗| 府谷县| 洮南市| 炎陵县| 泾阳县| 竹山县| 中超| 涡阳县| 射洪县| 旬阳县| 留坝县| 静宁县| 荃湾区| 高淳县| 张家港市| 滕州市| 庆元县| 龙山县| 长沙市|