一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - ASP.NET Core對(duì)不同類(lèi)型的用戶(hù)進(jìn)行區(qū)別限流詳解

ASP.NET Core對(duì)不同類(lèi)型的用戶(hù)進(jìn)行區(qū)別限流詳解

2021-12-08 15:21波斯碼 ASP.NET教程

這篇文章主要介紹了ASP.NET Core對(duì)不同類(lèi)型的用戶(hù)進(jìn)行區(qū)別限流的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

老板提出了一個(gè)新需求,從某某天起,免費(fèi)用戶(hù)每天只能查詢(xún)100次,收費(fèi)用戶(hù)100W次。

這是一個(gè)限流問(wèn)題,聰明的你也一定想到了如何去做:記錄用戶(hù)每一天的查詢(xún)次數(shù),然后根據(jù)當(dāng)前用戶(hù)的類(lèi)型使用不同的數(shù)字做比較,超過(guò)指定的數(shù)字就返回錯(cuò)誤。

嗯,原理就是這么簡(jiǎn)單。不過(guò)真正寫(xiě)起來(lái)還要考慮更多問(wèn)題:

  • 統(tǒng)計(jì)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是什么樣的?字典 or 行記錄?
  • 統(tǒng)計(jì)數(shù)據(jù)記錄到哪里??jī)?nèi)存 or MySQL or Redis?
  • 分布式應(yīng)用怎么精確計(jì)數(shù)?分布式鎖 or 隊(duì)列 or 事務(wù)?
  • 吞吐量比較大時(shí)如何扛得住??jī)?nèi)存 or Redis or 數(shù)據(jù)庫(kù)集群?
  • 這些數(shù)據(jù)要一直保留嗎?自動(dòng)過(guò)期 or 定期清理?
  • 如何返回錯(cuò)誤?自定義錯(cuò)誤 or HTTP標(biāo)準(zhǔn)錯(cuò)誤碼?

自己去做這些事還是有點(diǎn)麻煩的,這里介紹一個(gè)ASP.NET Core的中間件來(lái)滿足這個(gè)限流需求:FireflySoft.RateLimit.AspNetCore。使用步驟如下:

1、安裝Nuget包

已經(jīng)發(fā)布到nuget.org,有多種安裝方式,選擇自己喜歡的就行了。

包管理器命令:

?
1
Install-Package FireflySoft.RateLimit.AspNetCore

或者.NET命令:

?
1
dotnet add package FireflySoft.RateLimit.AspNetCore

或者項(xiàng)目文件直接添加:

?
1
2
3
<ItemGroup>
<PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="1.2.0" />
</ItemGroup>

2、使用中間件

在Startup.Configure中使用中間件,演示代碼如下(下邊會(huì)有詳細(xì)說(shuō)明):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
 ...
 
 app.UseRateLimit(new RateLimitProcessor<HttpContext>.Builder()
  .WithAlgorithm(new FixedWindowAlgorithm<HttpContext>( new[] {
   new FixedWindowRateLimitRule<HttpContext>()
   {
    Id = "1",
    ExtractTarget = context =>
    {
     // 這里假設(shè)用戶(hù)Id是從cookie中傳過(guò)來(lái)的,需根據(jù)實(shí)際情況獲取
     return context.Request.GetTypedHeaders().Get<string>("userId");
    },
    CheckRuleMatching = context =>
    {
     // 這里假設(shè)用戶(hù)類(lèi)型是從cookie中傳過(guò)來(lái)的,實(shí)際可能需要根據(jù)用戶(hù)Id再去查詢(xún)
     // 0免費(fèi)用戶(hù) 1收費(fèi)用戶(hù)
     int userType = context.Request.GetTypedHeaders().Get<int>("userType");
     if(userType==0){
      return true;
     }
     return false;
    },
    Name="免費(fèi)用戶(hù)限流規(guī)則",
    LimitNumber=100,
    StatWindow=TimeSpan.FromDays(1)
   },
   new FixedWindowRateLimitRule<HttpContext>()
   {
    Id = "2",
    ExtractTarget = context =>
    {
     // 這里假設(shè)用戶(hù)Id是從cookie中傳過(guò)來(lái)的,需根據(jù)實(shí)際情況獲取
     return context.Request.GetTypedHeaders().Get<string>("userId");
    },
    CheckRuleMatching = context =>
    {
     // 這里假設(shè)用戶(hù)類(lèi)型是從cookie中傳過(guò)來(lái)的,實(shí)際可能需要根據(jù)用戶(hù)Id再去查詢(xún)
     // 0免費(fèi)用戶(hù) 1收費(fèi)用戶(hù)
     int userType = context.Request.GetTypedHeaders().Get<int>("userType");
     if(userType==1){
      return true;
     }
     return false;
    },
    Name="收費(fèi)用戶(hù)限流規(guī)則",
    LimitNumber=1000000,
    StatWindow=TimeSpan.FromDays(1)
   }
  }))
  .WithError(new Core.RateLimitError()
  {
   Code=429,
   Message = "查詢(xún)數(shù)達(dá)到當(dāng)天最大限制"
  })
  //.WithStorage(new RedisStorage(StackExchange.Redis.ConnectionMultiplexer.Connect("localhost")))
  .Build());
 
 ...
}

使用此中間件需要構(gòu)建一個(gè)名為RateLimitProcessor的限流處理器實(shí)例,指定限流處理的請(qǐng)求類(lèi)型HttpContext,設(shè)置限流處理的三個(gè)方面:

限流使用的算法以及對(duì)應(yīng)的規(guī)則

限流算法,根據(jù)這個(gè)需求使用固定窗口算法就可以了,也稱(chēng)為計(jì)數(shù)器算法。此中間件還提供了滑動(dòng)窗口算法、漏桶算法、令牌桶算法,可以根據(jù)需要選擇。

不同的限流算法有不同的限流規(guī)則類(lèi)型,在這里使用的是固定窗口限流規(guī)則,針對(duì)免費(fèi)用戶(hù)和收費(fèi)用戶(hù)分別定義了兩個(gè)規(guī)則,注意其中的幾個(gè)參數(shù):

  • Id:在當(dāng)前的版本中Id必須手動(dòng)指定,并且不能重復(fù)。
  • ExtractTarget:傳遞一個(gè)方法用于從請(qǐng)求中提取限流目標(biāo),這里就是用戶(hù)Id。
  • CheckRuleMatching傳遞一個(gè)方法用于檢查當(dāng)前請(qǐng)求是否適用當(dāng)前規(guī)則,這里根據(jù)用戶(hù)類(lèi)型進(jìn)行判斷。
  • StatWindow是固定窗口的大小,是一個(gè)時(shí)間跨度,這里是1天。
  • LimitNumber是限流值,在StatWindow時(shí)間內(nèi)請(qǐng)求數(shù)超過(guò)它就會(huì)觸發(fā)限流。

這里有兩個(gè)比較有意思的設(shè)置:ExtractTarget和CheckRuleMatching,他們共同作用,讓用戶(hù)可以完全自由的定制自己限流的目標(biāo)和條件,無(wú)論是IP、ClientId或者Url。

限流統(tǒng)計(jì)數(shù)據(jù)的持久化方式

FireflySoft.RateLimit中的限流計(jì)數(shù)目前支持保存在內(nèi)存或者Redis中,也可以通過(guò)實(shí)現(xiàn)IRateLimitStorage來(lái)定義一個(gè)新的存儲(chǔ)器,不設(shè)置時(shí)默認(rèn)為內(nèi)存存儲(chǔ)。

對(duì)于只需要部署一份的程序,絕大部分情況下使用內(nèi)存就夠了;但是如果限流的時(shí)間窗口比較長(zhǎng),比如1小時(shí)限制300次,重啟就會(huì)丟失計(jì)數(shù),這可能是個(gè)風(fēng)險(xiǎn),此時(shí)使用Redis會(huì)比較合適。對(duì)于分布式應(yīng)用,也建議使用Redis存儲(chǔ)。

限流統(tǒng)計(jì)數(shù)據(jù)會(huì)根據(jù)限流時(shí)間窗口自動(dòng)過(guò)期移除。

被限流時(shí)的錯(cuò)誤碼和消息

默認(rèn)限流錯(cuò)誤Code是429,這個(gè)會(huì)作為HttpStatusCode返回;Message默認(rèn)為null,你可以修改為自己的任意文字提示,這個(gè)會(huì)作為Http Body的內(nèi)容返回。

以上就是使用FireflySoft.RateLimit.AspNetCore對(duì)不同類(lèi)型的用戶(hù)進(jìn)行區(qū)別限流的使用方法。

如果覺(jué)得還是限制的有點(diǎn)死,比如返回錯(cuò)誤信息部分,想返回一個(gè)json格式的錯(cuò)誤消息,還可以使用FireflySoft.RateLimit.Core這個(gè)包來(lái)封裝自己的ASP.NET Core中間件。

如果想在這個(gè)程序的基礎(chǔ)上再改造下,可以fork這個(gè)項(xiàng)目:https://github.com/bosima/FireflySoft.RateLimit

總結(jié)

到此這篇關(guān)于ASP.NET Core對(duì)不同類(lèi)型的用戶(hù)進(jìn)行區(qū)別限流的文章就介紹到這了,更多相關(guān)ASP.NET Core用戶(hù)區(qū)別限流內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/bossma/p/asp-net-core-rate-limit-for-different-types-of-users.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91制片厂制作果冻传媒123 | 91肥熟国产老肥熟在线 | 99在线精品日韩一区免费国产 | 欧美同性video | 亚洲欧美日韩中文高清一 | 惩罚美女妲己的尤老师 | 被夫上司强迫中文 | 国色天香社区在线视频免费观看 | 久久免费资源福利资源站 | 日本人添下面的全过程 | 欧美日韩国产在线人成 | 饭冈加奈子黑人解禁在线播放 | 小夫妻天天恶战 | 王的视频视ivk | videosxxxx老女人 | 14一15sexvideo日本 | 污樱桃视频 | 沉沦艳妇杨幂肉体小说 | 欧美激情精品久久久久久不卡 | 精品国产影院 | 九色PORNY真实丨国产免费 | 99综合在线| 嫩草在线视频www免费观看 | 妇伦小说| 我和岳的性事小说 | 5g在线观看 | 亚飞与亚基高清国语在线观看 | 青青草原影院 | 亚洲欧美在线观看一区二区 | 无套内谢大学生A片 | 99久久综合精品免费 | 亚洲国产精品嫩草影院久久 | 日韩欧美色 | 深夜精品高中女学生 | 国产在线综合网 | 日本一区二区在线不卡 | 免费又爽又黄禁片视频在线播放 | 桃乃木香奈作品在线 | 香蕉在线精品亚洲第一区 | 超兴奋朋友的中文字幕下 | 日本天堂影院在线播放 |