在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 ...
随机推荐
- 虚拟dom的优缺点
虚拟dom 是js模拟的一颗dom树,也是 js 对象 : 虚拟dom 时相对于 真实dom而言的,操作真实 dom 开销太大,降低了性能,所以使用 虚拟 dom 替代真实 dom 完成操作和计算功能 ...
- SqlUtils 使用
一.前言 随着 Solon 3.0 版本发布,新添加的 SqlUtils 接口,用于操作数据库,SqlUtils 是对 Jdbc 原始接口的封装.适合 SQL 极少或较复杂,或者 ORM 不适合的场景 ...
- 这十年我与广告不共戴天练就的十八般武艺 #PC去广告 #手机去广告
背景 大家应该都体会过广告的苦恼,比如看着好看的电视,突然给播放广告,这时候痛苦系数飙升.随着社会进步,广告的载体,还有形式也越来越多,比如手机端各种APP启动广告,PC端软件弹窗,网站Banner等 ...
- KubeSphere 社区双周报|2024.05.09-05.23
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Awesome Tools,程序员常用高效实用工具、软件资源精选,办公效率提升利器!
前言 在当今这个技术日新月异的时代,开发者只有持续学习,才能紧跟时代的浪潮.为了助力开发者在高效学习与工作中实现平衡(告别996的束缚),众多卓越且实用的开发工具应运而生,它们如同强大的助力器,极大地 ...
- error loading sources list: ('The read operation timed out',)解决办法!!
一.灵魂四问 1.为什么叫rosdepc? rosdepc,c指的是China中国,主要用于和rosdep区分. 2.rosdepc和rosdep功能一致吗? rosdep官方最新版源码直接修改的,小 ...
- windows宝塔面板请使用正确的入口登录面板问题解决记录
问题起因:浏览器升级面板的时候,浏览器卡死,导致登录不进,cmd里面修复或者更新依然显示请使用正确的入口登录面板. 解决方法: 先停止宝塔面板,然后将下面这个目录删掉 C:\Program Files ...
- 全中国有多少公网IP地址?
之前为了准备CTF比赛,搞了一个云服务器,顺便申请了一个公网IP. 看着申请到的IP地址,我突然想到了一个问题:不是早就说IP地址已经耗尽了吗,为什么我随便就能申请到,是谁在负责IP地址的管理分配,咱 ...
- php如何解决高并发
PHP交流群 656679284 为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! 1.应用和静态资源分离 将静态资源(js,css,图片等)放到专门的服务器中. 2.页面缓存 将应用 ...
- 国产化UOS适配
配置本地iso镜像为apt源 把镜像放到目录下 /home/gaohongyu/debian/uniontechos-server-20-enterprise-1030-arm64.iso 创建目录 ...