.NET 高效灵活的API速率限制解决方案
前言
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请求的速率控制,保护系统免受恶意请求或过载请求的侵害。
同时,该库还提供了简洁明了的API和示例代码,使得用户能够快速上手并集成到现有系统中。
.NET 高效灵活的API速率限制解决方案的更多相关文章
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
百度为何开源深度机器学习平台? 有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举. 5月20日,百度在github上开源了其 ...
- iOS 高效灵活地配置可复用视图组件的主题
本文首发于 Ficow Shen's Blog,原文地址: iOS 高效灵活地配置可复用视图组件的主题. 内容概览 前言 如何配置主题? 如何更高效地配置主题? 面向协议/接口的方案 ...
- Kong:Nginx支持的API Gateway管理解决方案
Kong的主要功能 Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短. Kong可在任何地方运行:它可以部署在单个或多个数据中心环境 ...
- 高效开发 Web 单页应用解决方案
于 2017 年初,有在 Github 建立并维护一个项目:Vue Boilerplate Template,欲成就一款开箱即用 Vue + Webpack 的脚手架模版:其目标与宗旨是:根据以往经验 ...
- eoLinker上线两周年+ AMS V4.0 发布:全新UI界面,带来领先的API开发管理解决方案!
2018年7月,eoLinker 发布了<eoLinker AMS 2018年年中用户调研问卷>,前后经历一周的时间,共收集到超过1000份有效调查问卷.超过300个有效改进意见. eoL ...
- 高效的后端API开发模板-illuminant
概要 整体介绍 补充说明 Q. 有了 prisma 自动生成的 graphql 接口, 为什么还要 rest 接口和 websocket 接口? Q. 为什么要通过 illuminant 加一层反向代 ...
- Web Api 跨域解决方案
一.跨域问题的由来 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容. 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻 ...
- 如何正确且高效实现OSSIM中文化的解决方案(图文详解)
前言 对于玩OSSIM的初学者或者中级水平的从业人员来说,都有一定必要性从中文看起,当然,最终还是英文的目标迈进,只是说,为了让自己更快速上手! 虽然系统说明支持中文,实际上,只是台湾的繁体中文而 ...
- Azure SQL 数据库的灵活缩放预览版简介
Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...
- 客户端持久化解决方案:indexedDB
客户端持久化解决方案:indexedDB indexedDB适合大量的结构化的数据存储:打开数据库和获取数据对象都是异步的: 需要开启事务,访问的objectStore都要是在开启的事务中. 数据库结 ...
随机推荐
- ITIL一定要去认证吗?哪个版本合适
关于ITIL的演进 ITIL是在演进发展中的,v1并不成功,v2 v3讲究流程与控制,其实都是偏向务虚,理论东西较多,能落地的少或许OGC的专家们自己也发现 光靠口头忽悠并不能说服最终用户接受ITIL ...
- 如何在低代码平台中引用 JavaScript ?
引言 在当今快速发展的数字化时代,企业对业务应用的需求日益复杂且多元.低代码开发平台作为一个创新的解决方案,以直观易用的设计理念,打破了传统的编程壁垒,让非技术人员也能轻松构建功能完备的Web应用程序 ...
- ios系统的css兼容问题处理和iOS上网页滑动不流畅问题
1.H5网页touch滑动的时候在苹果手机上出现不流畅的问题 -webkit-overflow-scrolling 用来控制元素在移动设备上是否使用滚动回弹效果. 解决办法:给所有网页添加如下样式 b ...
- centos 文件系统权限
模板:drwxrwxrwx r表是读 (Read) .w表示写 (Write) .x表示执行 (eXecute) 读.写.运行三项权限可以用数字表示,就是r=4,w=2,x=1, 777就是rwxrw ...
- 基本base样式
/* 去除常见标签默认的 margin 和 padding */ body, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, input { ma ...
- [BZOJ4358]permu线段树+莫队
先放代码 晚上补(争取) [BZOJ4358]permu 线段树+莫队做法 序列操作,多次询问,无修,标准的莫队. 在如何在不同区间内转移的问题上,我选择用线段树来维护(没听xfg讲回滚莫队不行啊) ...
- 一次nginx文件打开数的问题排查处理
现象:nginx域名配置合并之后,发现consul-template无法完成nginx重载,然后发现需要重启nginx,才能让配置生效. 注意:下次哪个服务有报错,就看重启时所有日志输出,各种情况日志 ...
- linux常用关机/重启命令:shutdown,init 0,init 6
目录 一.使用shutdown关机,重启,定时关机 二.使用init关机/重启 一.使用shutdown关机,重启,定时关机 1.设置计算机10分钟之后关机 [root@node5 ~]# shutd ...
- python377和python27的区别?
python27无法解释print(1,2,3,sep="*"),Windows命令行窗口运行会报语法错误:无效语法 SyntaxError:invalid syntax pyt ...
- [COCI2008-2009 #2] PERKET
传送锚点:https://www.luogu.com.cn/problem/P2036 题目描述 Perket 是一种流行的美食.为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽 ...