在Asp.netCore中使用Attribute来描述限流的操作步骤

 更新时间:2024年12月26日 09:26:19   作者:老九  
这篇文章主要介绍了在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来描述限流的文章就介绍到这了,更多相关Asp.netCore Attribute限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • asp.net中日历函数Calendar的使用方法

    asp.net中日历函数Calendar的使用方法

    calendar 控件用于在浏览器中显示日历,该控件可显示某个月的日历,允许用户选择日期,也可以跳到前一个或下一个月
    2011-05-05
  • ASP.NET Core MVC中的标签助手(TagHelper)用法

    ASP.NET Core MVC中的标签助手(TagHelper)用法

    这篇文章介绍了ASP.NET Core MVC中标签助手(TagHelper)的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • asp.net 上传或下载当文件名包含有特殊字符"#"的处理

    asp.net 上传或下载当文件名包含有特殊字符"#"的处理

    在上传或下载文件时,当文件名包含有"#"特殊字符时,上传以后的文件会被改名字,造成下载也下载不了。
    2010-03-03
  • ASP.NET Core中的Controller使用示例

    ASP.NET Core中的Controller使用示例

    这篇文章主要介绍了ASP.NET Core中的Controller使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • asp.net“服务器应用程序不可用” 解决方法

    asp.net“服务器应用程序不可用” 解决方法

    服务器应用程序不可用 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用。请点击 Web 浏览器中的“刷新”按钮重试您的请求。 管理员注意事项: 详述此特定请求失败原因的错误消息可在 Web 服务器的系统事件日志中找到。请检查此日志项以查明导致该错误发生的原因。
    2008-10-10
  • asp.net利用cookie保存用户密码实现自动登录的方法

    asp.net利用cookie保存用户密码实现自动登录的方法

    这篇文章主要介绍了asp.net利用cookie保存用户密码实现自动登录的方法,实例分析了asp.net针对cookie的创建、提取与销毁操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • VS2013的Browser Link引起的问题

    VS2013的Browser Link引起的问题

    这篇文章主要为大家详细介绍了VS2013的Browser Link引起的问题,以及Browser Link问题的解决方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • .NET Core实现企业微信获取部门成员

    .NET Core实现企业微信获取部门成员

    这篇文章介绍了.NET Core实现企业微信获取部门成员的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • asp.net core 中的Jwt(Json Web Token)的使用详解

    asp.net core 中的Jwt(Json Web Token)的使用详解

    session不支持分布式并且在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这篇文章主要介绍了asp.net core 中的Jwt(Json Web Token)的使用,需要的朋友可以参考下
    2022-10-10
  • Could not load file or assembly "App_Licenses.dll"的问题

    Could not load file or assembly "App_Licenses.dll"

    Could not load file or assembly "App_Licenses.dll"的问题
    2010-03-03

最新评论