日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core中使用令牌桶限流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在限流時一般會限制每秒或每分鐘的請求數(shù),簡單點一般會采用計數(shù)器算法,這種算法實現(xiàn)相對簡單,也很高效,但是無法應(yīng)對瞬時的突發(fā)流量。

比如限流每秒100次請求,絕大多數(shù)的時間里都不會超過這個數(shù),但是偶爾某一秒鐘會達(dá)到120次請求,接著很快又會恢復(fù)正常,假設(shè)這種突發(fā)的流量不會對系統(tǒng)穩(wěn)定性帶來實質(zhì)性的影響,則可以在一定程度上允許這種瞬時的突發(fā)流量,從而為用戶帶來更好的可用性體驗。這就是令牌桶算法的用武之地。

該算法的基本原理是:有一個令牌桶,容量是X,每Y單位時間會向桶中放入Z個令牌,如果桶中的令牌數(shù)超過X,則丟棄令牌;請求要想通過首先需要從令牌桶中獲取一個令牌,獲取不到令牌則拒絕請求。可以看出對于令牌桶算法X、Y、Z這幾個數(shù)的設(shè)定特別重要,Z應(yīng)該略大于絕大數(shù)時候的Y單位時間內(nèi)的請求數(shù),系統(tǒng)會長期處于這個狀態(tài),X可以是系統(tǒng)允許承載的瞬時最大請求數(shù),系統(tǒng)不能長時間處于這個狀態(tài)。

這里介紹一個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中使用中間件,演示代碼如下(下邊會有詳細(xì)說明):

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();...}

如上需要先注冊服務(wù),然后使用中間件。

注冊服務(wù)的時候需要提供限流算法和對應(yīng)的規(guī)則:

  • 這里使用進(jìn)程內(nèi)令牌桶算法,對于分布式服務(wù)還可以使用Redis令牌桶算法,支持StackExchange.Redis。

  • 桶的容量是30,每秒流入10個令牌。

  • ExtractTarget用于提取限流目標(biāo),這里是每個不同的請求Path。如果有IO請求,這里還支持對應(yīng)的異步方法ExtractTargetAsync。

  • CheckRuleMatching用于驗證當(dāng)前請求是否限流。如果有IO請求,這里還支持對應(yīng)的異步方法CheckRuleMatchingAsync。

  • 默認(rèn)被限流時會返回HttpStatusCode 429,可以在AddRateLimit時使用可選參數(shù)error自定義這個值,以及Http Header和Body中的內(nèi)容。

基本的使用就是上邊例子中的這些了。


?另外這個項目也支持.Net Framework,需要安裝另一個包 FireflySoft.RateLimit.AspNet,如果你的程序基于.net 4.x,可以選擇這個版本。

同時在非Web應(yīng)用場景也有對應(yīng)的包支持:FireflySoft.RateLimit.Core ,只不過需要自己處理限流結(jié)果。

他們的使用方法都很類似,邏輯也很簡單,都是需要先創(chuàng)建一個算法實例,然后通過這個實例去檢查每一次請求,根據(jù)業(yè)務(wù)需要處理檢查結(jié)果就可以了。

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core中使用令牌桶限流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。