FireflySoft.RateLimit是基於.NET Core和.NET Standard構建,支援多種速率限制演算法和策略,包括固定視窗、滑動視窗、漏桶、令牌桶等。透過簡單的配置和整合,開發者可以快速地將其應用到現有的Web API、微服務或中介軟體中,實現對請求的精確控制。
同時,該庫還支援分散式系統中的速率限制,透過Redis等分散式快取系統實現資料的共享和同步,確保在不同節點之間實現一致的速率限制效果。
除了強大的功能外,FireflySoft.RateLimit還注重易用性和效能最佳化。提供了簡潔明瞭的API和豐富的示例程式碼,使得開發者能夠快速地掌握其使用方法。同時,我們還對演算法進行了最佳化,減少了不必要的計算開銷,以確保在高併發場景下仍然能夠保持高效的效能表現。
總之,FireflySoft.RateLimit 是一個不錯的限流類庫,其核心簡單輕巧,能夠靈活應對各種需求的限流場景。希望透過它能夠幫助更多的開發者保護系統和API免受惡意請求和過載請求的侵害,同時也期待與大家一起探索更多可能性和創新點。
功能
-
多種限流演算法:內建固定視窗、滑動視窗、漏桶、令牌桶四種演算法,還可自定義擴充套件。
-
多種計數儲存:目前支援記憶體、Redis(含叢集)兩種儲存方式。
-
分散式友好:透過Redis儲存支援分散式程式統一計數。
-
限流目標靈活:可以從請求中提取各種資料用於設定限流目標。
-
支援限流懲罰:可以在客戶端觸發限流後鎖定一段時間不允許其訪問。
-
時間視窗增強:支援到毫秒級別;支援從秒、分鐘、小時、日期等時間週期的起始點開始。
-
實時限流跟蹤:當前計數週期內已處理的請求數、剩餘允許請求數,以及計數週期重置的時間。
-
動態更改規則:支援程式執行時動態更改限流規則。
-
自定義錯誤:可以自定義觸發限流後的錯誤碼和錯誤訊息。
-
普適性:原則上可以滿足任何需要限流的場景。
專案說明
專案 | 說明 |
---|---|
FireflySoft.RateLmit.Core | 演算法、規則等限流核心控制程式。 |
FireflySoft.RateLimit.AspNet | ASP.NET 限流處理器,支援 .NET 4.6.1 及以上版本。 |
FireflySoft.RateLimit.AspNetCore | ASP.NET Core 限流中介軟體,支援 .NET Core 2.0 及後續版本。 |
FireflySoft.RateLimit.Core.UnitTest | FireflySoft.RateLimit.Core 的單元測試。 |
FireflySoft.RateLimit.Core.BenchmarkTest | FireflySoft.RateLimit.Core 的基準測試。 |
Samples/Console | 使用 FireflySoft.RateLmit.Core 的控制檯示例程式. |
Samples/AspNet | 使用 FireflySoft.RateLimit.AspNet 的普通示例程式。 |
Samples/AspNetCore | 使用 FireflySoft.RateLimit.AspNetCore 的普通示例程式。 |
Samples/RuleAutoUpdate | 使用 FireflySoft.RateLimit.AspNetCore 的自動更新限流規則的示例程式。 |
使用說明
ASP.NET Core 應用
1、安裝 Nuget 包,使用包管理器控制檯:
Install-Package FireflySoft.RateLimit.AspNetCore
或者使用 .NET CLI:
dotnet add package FireflySoft.RateLimit.AspNetCore
或者直接新增到專案檔案中:
<ItemGroup> <PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="2.*" /> </ItemGroup>
2、使用中介軟體
在Startup.cs中註冊服務並使用中介軟體:
public void ConfigureServices(IServiceCollection services) { ... services.AddRateLimit(new InProcessFixedWindowAlgorithm( new[] { new FixedWindowRule() { ExtractTarget = context => { // 提取限流目標 // 這裡是直接從請求中提取Path作為限流目標,還可以多種組合,甚至去遠端查詢一些資料 return (context as HttpContext).Request.Path.Value; }, CheckRuleMatching = context => { // 檢查當前請求是否要做限流 // 比如有些Url是不做限流的、有些使用者是不做限流的 return true; }, Name="default limit rule", LimitNumber=30, // 限流時間視窗內的最大允許請求數量 StatWindow=TimeSpan.FromSeconds(1) // 限流計數的時間視窗 } }) ); ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseRateLimit(); ... }
ASP.NET 應用
1、安裝 Nuget 包,使用包管理器控制檯:
Install-Package FireflySoft.RateLimit.AspNet
2、註冊訊息處理器,開啟 Global.asax.cs,使用下面的程式碼新增限流處理器:
protected void Application_Start() { ... GlobalConfiguration.Configuration.MessageHandlers.Add( new RateLimitHandler( new Core.InProcessAlgorithm.InProcessFixedWindowAlgorithm( new[] { new FixedWindowRule() { ExtractTarget = context => { return (context as HttpRequestMessage).RequestUri.AbsolutePath; }, CheckRuleMatching = context => { return true; }, Name="default limit rule", LimitNumber=30, StatWindow=TimeSpan.FromSeconds(1) } }) )); ... }
其它型別應用
1、安裝 Nuget 包,使用包管理器控制檯
Install-Package FireflySoft.RateLimit.Core
或者 .NET CLI
dotnet add package FireflySoft.RateLimit.Core
2、使用限流演算法,使用 IAlgorithm 過濾每個請求, 處理 Check 方法的返回值。
// 定義限流規則 var fixedWindowRules = new FixedWindowRule[] { new FixedWindowRule() { Id = "3", StatWindow=TimeSpan.FromSeconds(1), LimitNumber=30, ExtractTarget = (request) => { return (request as SimulationRequest).RequestResource; }, CheckRuleMatching = (request) => { return true; }, } }; // 使用限流演算法 IAlgorithm algorithm = new InProcessFixedWindowAlgorithm(fixedWindowRules); // 過濾請求 var result = algorithm.Check(new SimulationRequest() { RequestId = Guid.NewGuid().ToString(), RequestResource = "home", Parameters = new Dictionary<string, string>() { { "from","sample" }, } });
SimulationRequest是一個自定義請求,你可以把它修改為任何適合自己的請求型別。
地址
https://github.com/bosima/FireflySoft.RateLimit
總結
FireflySoft.RateLimit 是一個功能強大且靈活的速率限制庫,適用於多種應用場景。
透過提供多種演算法和策略、支援分散式系統、易於配置和擴充套件等特點,使得使用者能夠輕鬆地實現API請求的速率控制,保護系統免受惡意請求或過載請求的侵害。