前言

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速率限制解决方案的更多相关文章

  1. 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

    百度为何开源深度机器学习平台?   有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举.   5月20日,百度在github上开源了其 ...

  2. iOS 高效灵活地配置可复用视图组件的主题

      本文首发于 Ficow Shen's Blog,原文地址: iOS 高效灵活地配置可复用视图组件的主题.   内容概览 前言 如何配置主题? 如何更高效地配置主题? 面向协议/接口的方案     ...

  3. Kong:Nginx支持的API Gateway管理解决方案

    Kong的主要功能 Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短. Kong可在任何地方运行:它可以部署在单个或多个数据中心环境 ...

  4. 高效开发 Web 单页应用解决方案

    于 2017 年初,有在 Github 建立并维护一个项目:Vue Boilerplate Template,欲成就一款开箱即用 Vue + Webpack 的脚手架模版:其目标与宗旨是:根据以往经验 ...

  5. eoLinker上线两周年+ AMS V4.0 发布:全新UI界面,带来领先的API开发管理解决方案!

    2018年7月,eoLinker 发布了<eoLinker AMS 2018年年中用户调研问卷>,前后经历一周的时间,共收集到超过1000份有效调查问卷.超过300个有效改进意见. eoL ...

  6. 高效的后端API开发模板-illuminant

    概要 整体介绍 补充说明 Q. 有了 prisma 自动生成的 graphql 接口, 为什么还要 rest 接口和 websocket 接口? Q. 为什么要通过 illuminant 加一层反向代 ...

  7. Web Api 跨域解决方案

    一.跨域问题的由来 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容. 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻 ...

  8. 如何正确且高效实现OSSIM中文化的解决方案(图文详解)

    前言   对于玩OSSIM的初学者或者中级水平的从业人员来说,都有一定必要性从中文看起,当然,最终还是英文的目标迈进,只是说,为了让自己更快速上手! 虽然系统说明支持中文,实际上,只是台湾的繁体中文而 ...

  9. Azure SQL 数据库的灵活缩放预览版简介

    Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...

  10. 客户端持久化解决方案:indexedDB

    客户端持久化解决方案:indexedDB indexedDB适合大量的结构化的数据存储:打开数据库和获取数据对象都是异步的: 需要开启事务,访问的objectStore都要是在开启的事务中. 数据库结 ...

随机推荐

  1. 2018-11-19-win10-uwp-使用-Azure-DevOps-自动构建

    title author date CreateTime categories win10 uwp 使用 Azure DevOps 自动构建 lindexi 2018-11-19 15:26:4 +0 ...

  2. 优秀的 Modbus 主站(主机、客户端)仿真器、串口调试工具

    目录 优秀的 Modbus 主站(主机.客户端)仿真器.串口调试工具 主要功能 软件截图 优秀的 Modbus 主站(主机.客户端)仿真器.串口调试工具 modbus master,modbus,串口 ...

  3. Pytorch入门—Tensors张量的学习

    Tensors张量的学习 张量是一种特殊的数据结构,与数组和矩阵非常相似.在PyTorch中,我们使用张量来编码模型的输入和输出,以及模型的参数. 张量类似于NumPy的ndarrays,只是张量可以 ...

  4. golang 常用操作

    golang 获取切片 slice 第一个 最后一个 元素 复合数据类型切片通常用作Go中索引数据的口语结构. 该类型[]intSlice是具有类型为integer的元素的切片. len函数用于获取切 ...

  5. three.js介绍和学习资料说明

    1.three.js能做什么 Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多.使用最广泛的三维引擎.既然Threejs是一款WebGL ...

  6. idea修改项目中某个模块名称

    1.修改模块名称 2.修改文件夹名称 3.修改本模块里面pom的名称 4.修改其他模块里面引用的名称

  7. leaflet 使用turfjs实现前端自定义插值

    Turf.js官网地址:http://turfjs.org/ Turf.js中的几何数据组织规范以WKT格式为标准.其官网中包含了详细的接口介绍和样例讲解.这里我给出我们需要用的接口: 参考地址: h ...

  8. 谈谈 Spring 的过滤器和拦截器

    前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况.那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景. ( ...

  9. Java 创建/识别条形码

    项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...

  10. SSH-Web 工具之 shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 安装及使用教程

    本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...