前言
FireflySoft.RateLimit是基于.NET Core和.NET Standard構(gòu)建,支持多種速率限制算法和策略,包括固定窗口、滑動(dòng)窗口、漏桶、令牌桶等。通過簡單的配置和集成,開發(fā)者可以快速地將其應(yīng)用到現(xiàn)有的Web API、微服務(wù)或中間件中,實(shí)現(xiàn)對請求的精確控制。
同時(shí),該庫還支持分布式系統(tǒng)中的速率限制,通過Redis等分布式緩存系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的共享和同步,確保在不同節(jié)點(diǎn)之間實(shí)現(xiàn)一致的速率限制效果。
除了強(qiáng)大的功能外,F(xiàn)ireflySoft.RateLimit還注重易用性和性能優(yōu)化。提供了簡潔明了的API和豐富的示例代碼,使得開發(fā)者能夠快速地掌握其使用方法。同時(shí),我們還對算法進(jìn)行了優(yōu)化,減少了不必要的計(jì)算開銷,以確保在高并發(fā)場景下仍然能夠保持高效的性能表現(xiàn)。
總之,F(xiàn)ireflySoft.RateLimit 是一個(gè)不錯(cuò)的限流類庫,其內(nèi)核簡單輕巧,能夠靈活應(yīng)對各種需求的限流場景。希望通過它能夠幫助更多的開發(fā)者保護(hù)系統(tǒng)和API免受惡意請求和過載請求的侵害,同時(shí)也期待與大家一起探索更多可能性和創(chuàng)新點(diǎn)。
功能
多種限流算法:內(nèi)置固定窗口、滑動(dòng)窗口、漏桶、令牌桶四種算法,還可自定義擴(kuò)展。
多種計(jì)數(shù)存儲(chǔ):目前支持內(nèi)存、Redis(含集群)兩種存儲(chǔ)方式。
分布式友好:通過Redis存儲(chǔ)支持分布式程序統(tǒng)一計(jì)數(shù)。
限流目標(biāo)靈活:可以從請求中提取各種數(shù)據(jù)用于設(shè)置限流目標(biāo)。
支持限流懲罰:可以在客戶端觸發(fā)限流后鎖定一段時(shí)間不允許其訪問。
時(shí)間窗口增強(qiáng):支持到毫秒級別;支持從秒、分鐘、小時(shí)、日期等時(shí)間周期的起始點(diǎn)開始。
實(shí)時(shí)限流跟蹤:當(dāng)前計(jì)數(shù)周期內(nèi)已處理的請求數(shù)、剩余允許請求數(shù),以及計(jì)數(shù)周期重置的時(shí)間。
動(dòng)態(tài)更改規(guī)則:支持程序運(yùn)行時(shí)動(dòng)態(tài)更改限流規(guī)則。
自定義錯(cuò)誤:可以自定義觸發(fā)限流后的錯(cuò)誤碼和錯(cuò)誤消息。
普適性:原則上可以滿足任何需要限流的場景。
項(xiàng)目說明
項(xiàng)目 | 說明 |
---|
FireflySoft.RateLmit.Core | 算法、規(guī)則等限流核心控制程序。 |
FireflySoft.RateLimit.AspNet | ASP.NET 限流處理器,支持 .NET 4.6.1 及以上版本。 |
FireflySoft.RateLimit.AspNetCore | ASP.NET Core 限流中間件,支持 .NET Core 2.0 及后續(xù)版本。 |
FireflySoft.RateLimit.Core.UnitTest | FireflySoft.RateLimit.Core 的單元測試。 |
FireflySoft.RateLimit.Core.BenchmarkTest | FireflySoft.RateLimit.Core 的基準(zhǔn)測試。 |
Samples/Console | 使用 FireflySoft.RateLmit.Core 的控制臺示例程序. |
Samples/AspNet | 使用 FireflySoft.RateLimit.AspNet 的普通示例程序。 |
Samples/AspNetCore | 使用 FireflySoft.RateLimit.AspNetCore 的普通示例程序。 |
Samples/RuleAutoUpdate | 使用 FireflySoft.RateLimit.AspNetCore 的自動(dòng)更新限流規(guī)則的示例程序。 |
使用說明
ASP.NET Core 應(yīng)用
1、安裝 Nuget 包,使用包管理器控制臺:
Install-Package FireflySoft.RateLimit.AspNetCore
或者使用 .NET CLI:
dotnet add package FireflySoft.RateLimit.AspNetCore
或者直接添加到項(xiàng)目文件中:
<ItemGroup><PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="2.*" /></ItemGroup>
2、使用中間件
在Startup.cs中注冊服務(wù)并使用中間件:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddRateLimit(new InProcessFixedWindowAlgorithm(
new[] {
new FixedWindowRule()
{
ExtractTarget = context =>
{
// 提取限流目標(biāo)
// 這里是直接從請求中提取Path作為限流目標(biāo),還可以多種組合,甚至去遠(yuǎn)程查詢一些數(shù)據(jù)
return (context as HttpContext).Request.Path.Value;
},
CheckRuleMatching = context =>
{
// 檢查當(dāng)前請求是否要做限流
// 比如有些Url是不做限流的、有些用戶是不做限流的
return true;
},
Name="default limit rule",
LimitNumber=30, // 限流時(shí)間窗口內(nèi)的最大允許請求數(shù)量
StatWindow=TimeSpan.FromSeconds(1) // 限流計(jì)數(shù)的時(shí)間窗口
}
})
);
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseRateLimit();
...
}
ASP.NET 應(yīng)用
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)
}
})
));
...
}
其它類型應(yīng)用
1、安裝 Nuget 包,使用包管理器控制臺
Install-Package FireflySoft.RateLimit.Core
或者 .NET CLI
dotnet add package FireflySoft.RateLimit.Core
2、使用限流算法,使用 IAlgorithm 過濾每個(gè)請求, 處理 Check 方法的返回值。
// 定義限流規(guī)則
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是一個(gè)自定義請求,你可以把它修改為任何適合自己的請求類型。
地址
https://github.com/bosima/FireflySoft.RateLimit
總結(jié)
FireflySoft.RateLimit 是一個(gè)功能強(qiáng)大且靈活的速率限制庫,適用于多種應(yīng)用場景。
通過提供多種算法和策略、支持分布式系統(tǒng)、易于配置和擴(kuò)展等特點(diǎn),使得用戶能夠輕松地實(shí)現(xiàn)API請求的速率控制,保護(hù)系統(tǒng)免受惡意請求或過載請求的侵害。
同時(shí),該庫還提供了簡潔明了的API和示例代碼,使得用戶能夠快速上手并集成到現(xiàn)有系統(tǒng)中。
轉(zhuǎn)自https://www.cnblogs.com/1312mn/p/18264444 作者小碼編匠
該文章在 2024/6/26 10:33:37 編輯過