国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - ASP.NET Core對不同類型的用戶進行區別限流詳解

ASP.NET Core對不同類型的用戶進行區別限流詳解

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

這篇文章主要介紹了ASP.NET Core對不同類型的用戶進行區別限流的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

老板提出了一個新需求,從某某天起,免費用戶每天只能查詢100次,收費用戶100W次。

這是一個限流問題,聰明的你也一定想到了如何去做:記錄用戶每一天的查詢次數,然后根據當前用戶的類型使用不同的數字做比較,超過指定的數字就返回錯誤。

嗯,原理就是這么簡單。不過真正寫起來還要考慮更多問題:

  • 統計數據的數據結構是什么樣的?字典 or 行記錄?
  • 統計數據記錄到哪里?內存 or MySQL or Redis?
  • 分布式應用怎么精確計數?分布式鎖 or 隊列 or 事務?
  • 吞吐量比較大時如何扛得住?內存 or Redis or 數據庫集群?
  • 這些數據要一直保留嗎?自動過期 or 定期清理?
  • 如何返回錯誤?自定義錯誤 or HTTP標準錯誤碼?

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

1、安裝Nuget包

已經發布到nuget.org,有多種安裝方式,選擇自己喜歡的就行了。

包管理器命令:

?
1
Install-Package FireflySoft.RateLimit.AspNetCore

或者.NET命令:

?
1
dotnet add package FireflySoft.RateLimit.AspNetCore

或者項目文件直接添加:

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

2、使用中間件

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

?
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 =>
    {
     // 這里假設用戶Id是從cookie中傳過來的,需根據實際情況獲取
     return context.Request.GetTypedHeaders().Get<string>("userId");
    },
    CheckRuleMatching = context =>
    {
     // 這里假設用戶類型是從cookie中傳過來的,實際可能需要根據用戶Id再去查詢
     // 0免費用戶 1收費用戶
     int userType = context.Request.GetTypedHeaders().Get<int>("userType");
     if(userType==0){
      return true;
     }
     return false;
    },
    Name="免費用戶限流規則",
    LimitNumber=100,
    StatWindow=TimeSpan.FromDays(1)
   },
   new FixedWindowRateLimitRule<HttpContext>()
   {
    Id = "2",
    ExtractTarget = context =>
    {
     // 這里假設用戶Id是從cookie中傳過來的,需根據實際情況獲取
     return context.Request.GetTypedHeaders().Get<string>("userId");
    },
    CheckRuleMatching = context =>
    {
     // 這里假設用戶類型是從cookie中傳過來的,實際可能需要根據用戶Id再去查詢
     // 0免費用戶 1收費用戶
     int userType = context.Request.GetTypedHeaders().Get<int>("userType");
     if(userType==1){
      return true;
     }
     return false;
    },
    Name="收費用戶限流規則",
    LimitNumber=1000000,
    StatWindow=TimeSpan.FromDays(1)
   }
  }))
  .WithError(new Core.RateLimitError()
  {
   Code=429,
   Message = "查詢數達到當天最大限制"
  })
  //.WithStorage(new RedisStorage(StackExchange.Redis.ConnectionMultiplexer.Connect("localhost")))
  .Build());
 
 ...
}

使用此中間件需要構建一個名為RateLimitProcessor的限流處理器實例,指定限流處理的請求類型HttpContext,設置限流處理的三個方面:

限流使用的算法以及對應的規則

限流算法,根據這個需求使用固定窗口算法就可以了,也稱為計數器算法。此中間件還提供了滑動窗口算法、漏桶算法、令牌桶算法,可以根據需要選擇。

不同的限流算法有不同的限流規則類型,在這里使用的是固定窗口限流規則,針對免費用戶和收費用戶分別定義了兩個規則,注意其中的幾個參數:

  • Id:在當前的版本中Id必須手動指定,并且不能重復。
  • ExtractTarget:傳遞一個方法用于從請求中提取限流目標,這里就是用戶Id。
  • CheckRuleMatching傳遞一個方法用于檢查當前請求是否適用當前規則,這里根據用戶類型進行判斷。
  • StatWindow是固定窗口的大小,是一個時間跨度,這里是1天。
  • LimitNumber是限流值,在StatWindow時間內請求數超過它就會觸發限流。

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

限流統計數據的持久化方式

FireflySoft.RateLimit中的限流計數目前支持保存在內存或者Redis中,也可以通過實現IRateLimitStorage來定義一個新的存儲器,不設置時默認為內存存儲。

對于只需要部署一份的程序,絕大部分情況下使用內存就夠了;但是如果限流的時間窗口比較長,比如1小時限制300次,重啟就會丟失計數,這可能是個風險,此時使用Redis會比較合適。對于分布式應用,也建議使用Redis存儲。

限流統計數據會根據限流時間窗口自動過期移除。

被限流時的錯誤碼和消息

默認限流錯誤Code是429,這個會作為HttpStatusCode返回;Message默認為null,你可以修改為自己的任意文字提示,這個會作為Http Body的內容返回。

以上就是使用FireflySoft.RateLimit.AspNetCore對不同類型的用戶進行區別限流的使用方法。

如果覺得還是限制的有點死,比如返回錯誤信息部分,想返回一個json格式的錯誤消息,還可以使用FireflySoft.RateLimit.Core這個包來封裝自己的ASP.NET Core中間件。

如果想在這個程序的基礎上再改造下,可以fork這個項目:https://github.com/bosima/FireflySoft.RateLimit

總結

到此這篇關于ASP.NET Core對不同類型的用戶進行區別限流的文章就介紹到這了,更多相關ASP.NET Core用戶區別限流內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一级在线视频 | 一本大道久久精品 | 国产一区二区在线免费观看 | 中文字幕在线一区二区三区 | 亚洲国产婷婷香蕉久久久久久99 | 黑人中文字幕一区二区三区 | 精品久久久久国产 | 色悠悠视频 | 国产精品一区二区三区在线 | 荷兰欧美一级毛片 | 一区在线视频 | 亚洲免费视频一区二区 | 91精品国产91久久综合桃花 | 狠狠淫 | 亚洲成人一区二区在线观看 | 欧美黄色片免费观看 | 亚洲欧美在线人成swag | 国产一区二区三区四区 | 中文字幕在线观看 | 美女国产精品 | 欧美日韩国产一区二区三区 | 欧美在线a| 春色网站 | 国产一区二区视频免费看 | 欧美视频精品在线 | 日韩操操 | 99精品在线观看 | 国内精品一区二区三区 | 黄色片在线播放 | 欧美午夜精品一区二区三区电影 | 在线 欧美 日韩 | 亚洲免费观看视频 | 久久er99热精品一区二区 | 国产第一区在线观看 | 在线视频中文字幕 | 国产高清视频一区二区 | 久久国产精品久久喷水 | 中文字幕精品视频 | 日本久久精品 | 精品久久一区二区三区 | 在线四区|