首页 > 编程语言 >在Asp.netCore中使用Attribute来描述限流

在Asp.netCore中使用Attribute来描述限流

时间:2024-12-25 15:31:15浏览次数:3  
标签:Asp netCore Attribute RateLimiterUnit 接口 限流 policy 单元

前言

同事问我Asp.netCore的RateLimiting是怎么使用的,我回答说很简单的,你只要按照如下步骤来:

  1. 在RateLimiterOptions上注册policy,记住policy对应的policyName
  2. 在Web应用添加UseRateLimiter()中间件
  3. 在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化

同事说他的众多接口中,需要整体限流的很少,几乎都是需要颗粒度更细的限流:

  1. 登录接口,需要对请求体的json对象的userName值做限流单元
  2. 找回密码接口,需要对请求路由里的userName值做限流单元
  3. 其它已经做了用户身份认证的接口,需要用userId值做限流单元
  4. xx特殊接口,需要用请求者IP值做限流单元
  5. yy接口需要从Form中取出yy值做限流单元
  6. zz接口需要从Header中取出zz值做限流单元
  7. 想自定义从HttpContext里获取限流单元

于是我们又造了一些Attribute,来处理上面的需求

  1. [RateLimiterUnit.FromBody(unitName: "$.userName")]
  2. [RateLimiterUnit.FromRoute(unitName: "userName")]
  3. [RateLimiterUnit.FromUser(unitName: ClaimTypes.NameIdentifier)]
  4. [RateLimiterUnit.FromRemoteIPAddress]
  5. [RateLimiterUnit.FromForm(unitName: "yy")]
  6. [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,RateLimiterUnit,接口,限流,policy,单元
From: https://www.cnblogs.com/kewei/p/18630545

相关文章

  • SpringCloud微服务项目实战 - 限流、熔断、降级处理
    SpringCloud微服务项目实战-限流、熔断、降级处理|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-----......
  • DotNetCore 3.1桌面应用在Windows 7 SP1 X86下不能运行的问题的解决方法
    遇到的问题一个小的桌面应用,发布到Windows7SP1x86系统,打包成Self-Contained进行发布的时候,运行后没反应,也不报错。打包成SingleFile之后,运行报错api-ms-win-crt-runtime-l1-1-0.dll缺失。之后尝试安装.NetCore3.1的DesktopRuntime,问题依旧。然后又搜索一阵,大概是Windows......
  • 了解 ASP.NET Core 中的中间件
     在.NETCore中,中间件(Middleware) 是处理HTTP请求和响应的核心组件。它们被组织成一个请求处理管道,每个中间件都可以在请求到达最终处理程序之前或之后执行操作。中间件可以用于实现各种功能,如身份验证、路由、日志记录、异常处理、静态文件服务等。什么是中间件?中间件......
  • sentinel学习笔记6-限流降级(上)
    本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏,写的好值得推荐,我整理的有所删减,推荐看原文。https://blog.csdn.net/baidu_28523317/category_10400605.htmlsentinel实现限流降级、熔断降级、黑白名单限流降级、系统自适应限流降级以及热点参数限流降级都是由Pro......
  • 深入解析RuoYi框架中的DataScopeAspect:不同权限类型的SQL语句生成与作用
    目录AOP简介面向切面编程(AOP)的概念AOP在RuoYi框架中的应用DataScopeAspect类的作用类的功能切点选择权限检查​编辑在前端如何给不同的用户设置不同的权限实际代码示例控制层服务层Mapper层DataScopeAspect类1.全部权限2.自定义权限3. 本部门及以下权限4.仅......
  • C#(asp.net)房屋租赁管理系统-计算机设计毕业源码64421
    目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3论文结构与章节安排2 房屋租赁管理系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例......
  • 分布式系统架构5:限流设计模式
    这是小卷对分布式系统架构学习的第5篇文章,今天来学习限流器和限流设计模式1.为什么要限流?任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建立面对超额流量自我保护的机制,而这个机制就是微服务中常说的“限流”2......
  • 【新手入门】树莓派Raspberry 3B+硬件安装散热片、散热风扇、外壳安装
    树莓派RaspberryPi3B+学习笔记今日达成:①散热片安装②散热风扇安装③外壳安装散热片安装我买的套装给了三个散热片,查了查网上的资料,比较应该比较的就是两个,分别给GPU和CPU散热(都在正面),散热片贴在正中间就可以,直接上图。找到一个比较好的视频,分享给大家:https://video.t......
  • 老生常谈——分布式限流:部分Sentinal源码解读
    基础知识HTTPCODE=429“请求过多”A.限流的类型服务端客户端限流的标的IP用户...基本要求准确限制过量的请求。低延时。限流器不能拖慢HTTP响应时间。尽量占用较少的内存。这是一个分布式限流器,可以在多个服务器或者进程之间共享。......
  • 基于ASP.NET的视频点播系统
    一、系统概述ASP.NET视频点播系统利用ASP.NET技术开发,旨在为用户提供一个高效、便捷的视频观看平台。该系统能够实现对视频资源的有效管理,同时为用户提供友好的用户界面和出色的播放功能。二、系统特点高效管理视频资源:管理员可以上传多种格式的视频,并为其设置详细信息,......