在Asp.netCore中使用Attribute来描述限流
前言
同事问我Asp.netCore的RateLimiting是怎么使用的,我回答说很简单的,你只要按照如下步骤来:
- 在RateLimiterOptions上注册policy,记住policy对应的policyName
- 在Web应用添加UseRateLimiter()中间件
- 在api对应的Action上标注[EnableRateLimiting(policyName)]
半小时后,同事说要对我告知他的RateLimiter功能差评,因为他得写几十种policy工作量很大,就连policyName的取名都让他头大。
让RateLimiting更简单
我在基于Yarp的网关上做过RateLimiting,将每个服务的所有Endpoint描述导出放到网关做网关的子级路由,然后基于Endpoint做可配置化的限流,代码实现上很复杂但使用灵活度非常可观。
但今天我们的问题范围是在单体WebApplication中,如何减少我同事的限流工作量。
限流器Attribute化
假如我们造了如下的Attribute:
- [RateLimiter.Concurrency(permitLimit: 10)]
- [RateLimiter.FixedWindow(permitLimit: 10, windowSeconds: 60)]
- [RateLimiter.SlidingWindow(permitLimit: 10, windowSeconds: 60, segmentsPerWindow: 5)]
让我的同事在Action上标记其中一个Attribute,他的开发时间短、代码可读性高,免去了他手写policy实现的巨量代码。
限流单元来源Attribute化
同事说他的众多接口中,需要整体限流的很少,几乎都是需要颗粒度更细的限流:
- 登录接口,需要对请求体的json对象的userName值做限流单元
- 找回密码接口,需要对请求路由里的userName值做限流单元
- 其它已经做了用户身份认证的接口,需要用userId值做限流单元
- xx特殊接口,需要用请求者IP值做限流单元
- yy接口需要从Form中取出yy值做限流单元
- zz接口需要从Header中取出zz值做限流单元
- 想自定义从HttpContext里获取限流单元
于是我们又造了一些Attribute,来处理上面的需求
- [RateLimiterUnit.FromBody(unitName: "$.userName")]
- [RateLimiterUnit.FromRoute(unitName: "userName")]
- [RateLimiterUnit.FromUser(unitName: ClaimTypes.NameIdentifier)]
- [RateLimiterUnit.FromRemoteIPAddress]
- [RateLimiterUnit.FromForm(unitName: "yy")]
- [RateLimiterUnit.FromHeader(unitName: "zz")]
再提供一个IRateLimiterUnitMetadata接口,让他实现自定义逻辑
public class YourRateLimiterUnitAttribute : Attribute, IRateLimiterUnitMetadata
{
public ValueTask<string?> GetUnitAsync(HttpContext context)
{
throw new NotImplementedException();
}
}
让RateLimiting能运行
上面提到的那些Attribute,目前只存在于我们理想中,我们需要把它变成实际。
我们需要实现实现一个policy,在policy里获取当前请求的Endpoint,从Endpoint的metadata里提取出我们上面定义的Attribute,根据Attribute的描述生成RateLimitPartition。
把这个唯一的policy注册到RatelimiterOptions中,再把它的policyName使用EnableRateLimitingAttribute添加到Endpoint的metadata中。
最后,使用标准的Asp.netCore的UseRateLimiter()中间件,就能把我们的限流器运行起来了。
最后
此项目是开源的,不管你在工作中有没有用到,但里面有意思的想法你可以来一起品。
在Asp.netCore中使用Attribute来描述限流的更多相关文章
- AutoMapper在asp.netcore中的使用
# AutoMapper在asp.netcore中的使用 automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,htt ...
- Asp.NetCore 中Aop的应用
前言 其实好多项目中,做一些数据拦截.数据缓存都有Aop的概念,只是实现方式不一样:之前大家可能都会利用过滤器来实现Aop的功能,如果是Asp.NetCore的话,也可能会使用中间件: 而这种实现方式 ...
- ASP.NET Core中使用漏桶算法限流
漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...
- 控制ASP.NET Web API 调用频率与限流
ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...
- Springboot中使用redis进行api限流
api限流的场景 限流的需求出现在许多常见的场景中 秒杀活动,有人使用软件恶意刷单抢货,需要限流防止机器参与活动 某api被各式各样系统广泛调用,严重消耗网络.内存等资源,需要合理限流 淘宝获取ip所 ...
- SignalR在Asp.NetCore中的使用
SignalR简介 ASP.NET SignalR是为ASP.NET 开发人员提供的一个库,旨在为你的Web应用迅速简便的添加实时通信功能.这个Web通信功能是指:客户端可以实时从服务端代码拉取数据, ...
- asp.netcore 深入了解配置文件加载过程
前言 配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- 壹佰文章最全总结| 《关于ASP.NETCore的分享之路》
学习路线图 (关于学习ASP.NET Core需要了解和掌握的知识点图) 一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了,自从春节开始,中间经历种种,慢慢的就开始微信公众号发文了,原因有 ...
- ASP.NETCore学习记录(一)
ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.N ...
随机推荐
- 为你的Windows用户设置无边框半透明头像
步骤一:锁定头像 Win+R输入gpedit.msc进入组策略编辑器,按图中所示,选择"计算机管理->管理模板->用户账户设定",将里面唯一选项"对所有账户使 ...
- 01_GoLand debug时出现Connected并且程序卡住的问题
01_GoLand debug时出现Connected并且程序卡住的问题 环境:win10.go version go1.19.4 windows/amd64.GoLand 2020.3.5 x64 ...
- Java学习十六—掌握注解:让编程更简单
一.关于注解 1.1 简介 Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据.它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译.部署或运行时进 ...
- python处理大量数据excel表格中间格式神器pickle.pkl文件操作说明
读取写入千万级别的excel文件费时费力,调试起来比较慢,面对这个问题,第一步可以先无脑全部转换成pkl文件,这样几乎和内存操作一样的速度. 例如: t=pd.read_excel("12月 ...
- 推荐一个 ASP.NET Core 的轻量级插件框架
前言 本文将介绍一个专为ASP.NET Core设计的轻量级插件框架--PluginCore,该框架不仅能够简化插件的开发与集成,还能大幅提高开发效率. 另外,还将简要介绍相关的前端技术和SDK支持, ...
- 对比 Unittest 和 Pytest
一.用例编写规则 1,Unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...
- Go下载依赖包失败的解决方法
jenkins构建job,执行go test命令报如下图的timeout错误 从报错信息中可以看出是因为下载依赖包超时 解决方法: go env查看go环境变量 GOSUMDB=sum.golang. ...
- JAVA 使用注解lombok@Builder和@Data,primary not found default constructor
由于添加@Builder会将@Data让类缺失无参构造器 应手动在实体中写构造函数并增加: @Tolerate 实体类名(){} 网上很多讲解 这里给一个我觉得讲的比较好的链接 https://www ...
- 在Keil中使用ST-LINK烧录STM32程序指南
前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多. 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发.最初我还是用J-LINK烧录C8 ...
- .NET Core 特性(Attribute)底层原理浅谈
简介 烂大街的资料不再赘述,简单来说就是给代码看的注释 Attribute的使用场景 Attribute不仅仅局限于C#中,在整个.NET框架中都提供了非常大的拓展点,任何地方都有Attribute的 ...