在Asp.netCore中使用Attribute來描述限流的操作步驟
前言
同事問我Asp.netCore的RateLimiting是怎么使用的,我回答說很簡(jiǎn)單的,你只要按照如下步驟來:
- 在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更簡(jiǎn)單
我在基于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)文章希望大家以后多多支持腳本之家!
- Asp.Net?Core7?preview4限流中間件新特性詳解
- ASP.NET?Core設(shè)置Ocelot網(wǎng)關(guān)限流
- ASP.NET?Core基于滑動(dòng)窗口實(shí)現(xiàn)限流控制
- ASP.NET?Core中間件實(shí)現(xiàn)限流的代碼
- 解決ASP.NET?Core中使用漏桶算法限流的問題
- ASP.NET?Core中使用滑動(dòng)窗口限流的問題及場(chǎng)景分析
- ASP.NET?Core使用固定窗口限流
- ASP.NET Core中使用令牌桶限流的實(shí)現(xiàn)
- Asp.NET Core 限流控制(AspNetCoreRateLimit)的實(shí)現(xiàn)
- ASP.NET Core對(duì)不同類型的用戶進(jìn)行區(qū)別限流詳解
相關(guān)文章
asp.net中日歷函數(shù)Calendar的使用方法
calendar 控件用于在瀏覽器中顯示日歷,該控件可顯示某個(gè)月的日歷,允許用戶選擇日期,也可以跳到前一個(gè)或下一個(gè)月2011-05-05ASP.NET?Core?MVC中的標(biāo)簽助手(TagHelper)用法
這篇文章介紹了ASP.NET?Core?MVC中標(biāo)簽助手(TagHelper)的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04asp.net 上傳或下載當(dāng)文件名包含有特殊字符"#"的處理
在上傳或下載文件時(shí),當(dāng)文件名包含有"#"特殊字符時(shí),上傳以后的文件會(huì)被改名字,造成下載也下載不了。2010-03-03asp.net“服務(wù)器應(yīng)用程序不可用” 解決方法
服務(wù)器應(yīng)用程序不可用 您試圖在此 Web 服務(wù)器上訪問的 Web 應(yīng)用程序當(dāng)前不可用。請(qǐng)點(diǎn)擊 Web 瀏覽器中的“刷新”按鈕重試您的請(qǐng)求。 管理員注意事項(xiàng): 詳述此特定請(qǐng)求失敗原因的錯(cuò)誤消息可在 Web 服務(wù)器的系統(tǒng)事件日志中找到。請(qǐng)檢查此日志項(xiàng)以查明導(dǎo)致該錯(cuò)誤發(fā)生的原因。2008-10-10asp.net利用cookie保存用戶密碼實(shí)現(xiàn)自動(dòng)登錄的方法
這篇文章主要介紹了asp.net利用cookie保存用戶密碼實(shí)現(xiàn)自動(dòng)登錄的方法,實(shí)例分析了asp.net針對(duì)cookie的創(chuàng)建、提取與銷毀操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01.NET Core實(shí)現(xiàn)企業(yè)微信獲取部門成員
這篇文章介紹了.NET Core實(shí)現(xiàn)企業(yè)微信獲取部門成員的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06asp.net?core?中的Jwt(Json?Web?Token)的使用詳解
session不支持分布式并且在服務(wù)器存儲(chǔ)一份用戶登錄的信息,這份登錄信息會(huì)在響應(yīng)時(shí)傳遞給瀏覽器,告訴其保存為cookie,以便下次請(qǐng)求時(shí)發(fā)送給我們的應(yīng)用,這篇文章主要介紹了asp.net?core?中的Jwt(Json?Web?Token)的使用,需要的朋友可以參考下2022-10-10Could not load file or assembly "App_Licenses.dll"
Could not load file or assembly "App_Licenses.dll"的問題2010-03-03