ASP.NET Core中使用令牌桶限流的實現(xiàn)
在限流時一般會限制每秒或每分鐘的請求數(shù),簡單點一般會采用計數(shù)器算法,這種算法實現(xiàn)相對簡單,也很高效,但是無法應(yīng)對瞬時的突發(fā)流量。
比如限流每秒100次請求,絕大多數(shù)的時間里都不會超過這個數(shù),但是偶爾某一秒鐘會達到120次請求,接著很快又會恢復(fù)正常,假設(shè)這種突發(fā)的流量不會對系統(tǒng)穩(wěn)定性帶來實質(zhì)性的影響,則可以在一定程度上允許這種瞬時的突發(fā)流量,從而為用戶帶來更好的可用性體驗。這就是令牌桶算法的用武之地。
該算法的基本原理是:有一個令牌桶,容量是X,每Y單位時間會向桶中放入Z個令牌,如果桶中的令牌數(shù)超過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中使用中間件,演示代碼如下(下邊會有詳細說明):
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ī)則:
- 這里使用進程內(nèi)令牌桶算法,對于分布式服務(wù)還可以使用Redis令牌桶算法,支持StackExchange.Redis。
- 桶的容量是30,每秒流入10個令牌。
- ExtractTarget用于提取限流目標(biāo),這里是每個不同的請求Path。如果有IO請求,這里還支持對應(yīng)的異步方法ExtractTargetAsync。
- CheckRuleMatching用于驗證當(dāng)前請求是否限流。如果有IO請求,這里還支持對應(yīng)的異步方法CheckRuleMatchingAsync。
- 默認被限流時會返回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é)果就可以了。
到此這篇關(guān)于ASP.NET Core中使用令牌桶限流的實現(xiàn)的文章就介紹到這了,更多相關(guān)ASP.NET Core中使用令牌桶限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Asp.Net?Core7?preview4限流中間件新特性詳解
- ASP.NET?Core設(shè)置Ocelot網(wǎng)關(guān)限流
- ASP.NET?Core基于滑動窗口實現(xiàn)限流控制
- ASP.NET?Core中間件實現(xiàn)限流的代碼
- 解決ASP.NET?Core中使用漏桶算法限流的問題
- ASP.NET?Core中使用滑動窗口限流的問題及場景分析
- ASP.NET?Core使用固定窗口限流
- Asp.NET Core 限流控制(AspNetCoreRateLimit)的實現(xiàn)
- ASP.NET Core對不同類型的用戶進行區(qū)別限流詳解
- 在Asp.netCore中使用Attribute來描述限流的操作步驟
相關(guān)文章
.NET?6新特性試用之System.Text.Json功能改進
這篇文章主要介紹了.NET?6新特性試用之System.Text.Json功能改進,2022-03-03推薦8項提高 ASP.NET Web API 性能的技術(shù)
ASP.NET Web API 是非常棒的技術(shù)。編寫 Web API 十分容易,以致于很多開發(fā)者沒有在應(yīng)用程序結(jié)構(gòu)設(shè)計上花時間來獲得很好的執(zhí)行性能。2014-08-08Asp Net Core開發(fā)筆記之如何給SwaggerUI加上登錄保護功能
這篇文章主要介紹了Asp Net Core開發(fā)筆記之如何給SwaggerUI加上登錄保護功能,本文以我最近在開發(fā)的單點認證項目(IdentityServerLite)為例給大家詳細講解,需要的朋友可以參考下2024-05-05datagrid綁定list沒有數(shù)據(jù) 表頭不顯示的解決方法
datagrid綁定list沒有數(shù)據(jù) 表頭不顯示的問題,那是因為 綁定了null,你給list new一下就好 表頭就會有啦2013-05-05visual Studio 2017創(chuàng)建簡單控制臺程序
這篇文章主要為大家詳細介紹了visual Studio 2017創(chuàng)建簡單控制臺程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11使用JavaScript代碼實現(xiàn)各種數(shù)據(jù)控件的反選功能 不要只做拖控件的菜鳥
在我們做許多項目的時候,會用到反選這個功能,但是我一般使用C#代碼創(chuàng)建數(shù)組遍歷實現(xiàn)功能,今天我想換一種語言實現(xiàn)一下,于是我就用JavaScript研究了一下怎么實現(xiàn)這個功能2011-12-12.NET?core項目AsyncLocal在鏈路追蹤中的應(yīng)用
這篇文章主要為大家介紹了.NET?core項目zhong?AsyncLocal在鏈路追蹤中的應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05