最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年12月26日 09:26:19   作者:老九  
這篇文章主要介紹了在Asp.netCore中使用Attribute來描述限流的操作步驟,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

前言

同事問我Asp.netCore的RateLimiting是怎么使用的,我回答說很簡單的,你只要按照如下步驟來:

  • 在RateLimiterOptions上注冊(cè)policy,記住policy對(duì)應(yīng)的policyName
  • 在Web應(yīng)用添加UseRateLimiter()中間件
  • 在api對(duì)應(yīng)的Action上標(biāo)注[EnableRateLimiting(policyName)]

半小時(shí)后,同事說要對(duì)我告知他的RateLimiter功能差評(píng),因?yàn)樗脤憥资Npolicy工作量很大,就連policyName的取名都讓他頭大。

讓RateLimiting更簡單

我在基于Yarp的網(wǎng)關(guān)上做過RateLimiting,將每個(gè)服務(wù)的所有Endpoint描述導(dǎo)出放到網(wǎng)關(guān)做網(wǎng)關(guān)的子級(jí)路由,然后基于Endpoint做可配置化的限流,代碼實(shí)現(xiàn)上很復(fù)雜但使用靈活度非常可觀。
但今天我們的問題范圍是在單體WebApplication中,如何減少我同事的限流工作量。

限流器Attribute化

假如我們?cè)炝巳缦碌腁ttribute:

  • [RateLimiter.Concurrency(permitLimit: 10)]
  • [RateLimiter.FixedWindow(permitLimit: 10, windowSeconds: 60)]
  • [RateLimiter.SlidingWindow(permitLimit: 10, windowSeconds: 60, segmentsPerWindow: 5)]

讓我的同事在Action上標(biāo)記其中一個(gè)Attribute,他的開發(fā)時(shí)間短、代碼可讀性高,免去了他手寫policy實(shí)現(xiàn)的巨量代碼。

限流單元來源Attribute化

同事說他的眾多接口中,需要整體限流的很少,幾乎都是需要顆粒度更細(xì)的限流:

  • 登錄接口,需要對(duì)請(qǐng)求體的json對(duì)象的userName值做限流單元
  • 找回密碼接口,需要對(duì)請(qǐng)求路由里的userName值做限流單元
  • 其它已經(jīng)做了用戶身份認(rèn)證的接口,需要用userId值做限流單元
  • xx特殊接口,需要用請(qǐng)求者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")]

再提供一個(gè)IRateLimiterUnitMetadata接口,讓他實(shí)現(xiàn)自定義邏輯

public class YourRateLimiterUnitAttribute : Attribute, IRateLimiterUnitMetadata
{
    public ValueTask<string?> GetUnitAsync(HttpContext context)
    {
        throw new NotImplementedException();
    }
}

讓RateLimiting能運(yùn)行

上面提到的那些Attribute,目前只存在于我們理想中,我們需要把它變成實(shí)際。

我們需要實(shí)現(xiàn)實(shí)現(xiàn)一個(gè)policy,在policy里獲取當(dāng)前請(qǐng)求的Endpoint,從Endpoint的metadata里提取出我們上面定義的Attribute,根據(jù)Attribute的描述生成RateLimitPartition。

把這個(gè)唯一的policy注冊(cè)到RatelimiterOptions中,再把它的policyName使用EnableRateLimitingAttribute添加到Endpoint的metadata中。

最后,使用標(biāo)準(zhǔn)的Asp.netCore的UseRateLimiter()中間件,就能把我們的限流器運(yùn)行起來了。

最后

此項(xiàng)目是開源的,不管你在工作中有沒有用到,但里面有意思的想法你可以來一起品。

到此這篇關(guān)于在Asp.netCore中使用Attribute來描述限流的文章就介紹到這了,更多相關(guān)Asp.netCore Attribute限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

沙洋县| 鄄城县| 金川县| 上饶县| 石城县| 大同县| 弋阳县| 阿鲁科尔沁旗| 乐亭县| 横山县| 朔州市| 常熟市| 郯城县| 湘潭县| 湘乡市| 铁岭县| 绥棱县| 城固县| 彩票| 彰化县| 天津市| 育儿| 保康县| 宾阳县| 黄梅县| 文成县| 北票市| 巴东县| 长乐市| 阜城县| 施甸县| 通辽市| 镇康县| 长汀县| 环江| 洪雅县| 常山县| 灵宝市| 扎兰屯市| 获嘉县| 武清区|