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

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

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

前言

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

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

半小時后,同事說要對我告知他的RateLimiter功能差評,因為他得寫幾十種policy工作量很大,就連policyName的取名都讓他頭大。

讓RateLimiting更簡單

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

限流器Attribute化

假如我們造了如下的Attribute:

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

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

限流單元來源Attribute化

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

  • 登錄接口,需要對請求體的json對象的userName值做限流單元
  • 找回密碼接口,需要對請求路由里的userName值做限流單元
  • 其它已經(jīng)做了用戶身份認(rèn)證的接口,需要用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接口,讓他實現(xiàn)自定義邏輯

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

讓RateLimiting能運行

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

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

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

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

最后

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

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

相關(guān)文章

最新評論

集安市| 屏南县| 库车县| 射洪县| 巍山| 太原市| 县级市| 新野县| 虞城县| 金乡县| 都江堰市| 济宁市| 光泽县| 普格县| 长治县| 西乌珠穆沁旗| 平塘县| 格尔木市| 南郑县| 阜平县| 奎屯市| 务川| 绥中县| 合肥市| 北流市| 精河县| 石屏县| 丰宁| 阜南县| 金乡县| 霍林郭勒市| 绵竹市| 绵阳市| 错那县| 沂源县| 中西区| 大足县| 汕头市| 沭阳县| 兴海县| 西林县|