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

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

 更新時間:2021年02月21日 14:44:10   作者:波斯碼  
這篇文章主要介紹了ASP.NET Core對不同類型的用戶進行區(qū)別限流的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

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

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

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

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

1、安裝Nuget包

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

包管理器命令:

Install-Package FireflySoft.RateLimit.AspNetCore

或者.NET命令:

dotnet add package FireflySoft.RateLimit.AspNetCore

或者項目文件直接添加:

<ItemGroup>
<PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="1.2.0" />
</ItemGroup>

2、使用中間件

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

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

 ...
}

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

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

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

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

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

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

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

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

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

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

被限流時的錯誤碼和消息

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

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

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

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

總結

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

相關文章

  • .NET邏輯分層架構總結

    .NET邏輯分層架構總結

    本人將從另一個角度來解析.NET分層架構的真正奧秘。分層,一些技術功底比較薄弱的程序員聽到分層就會聯(lián)想到三層架構(BLL,DAL之類的),其實不是,分層是一個很大的技術框架思想,三層架構只不過是對普通的信息系統(tǒng)來說,將信息的流轉(zhuǎn)通過三層來分解,
    2015-06-06
  • 在.NET Core中使用異步編程的方法步驟

    在.NET Core中使用異步編程的方法步驟

    這篇文章主要介紹了在.NET Core中使用異步編程的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 在.NET中取得代碼行數(shù)的方法

    在.NET中取得代碼行數(shù)的方法

    這篇文章主要介紹了在.NET中如何取得代碼行數(shù),需要的朋友可以參考下
    2014-06-06
  • ASP.NET MVC DropDownList數(shù)據(jù)綁定及使用詳解

    ASP.NET MVC DropDownList數(shù)據(jù)綁定及使用詳解

    DropDownList 控件用于創(chuàng)建下拉列表。DropDownList 控件中的每個可選項都是由 ListItem 元素定義的!該控件支持數(shù)據(jù)綁定
    2012-12-12
  • asp.net單文件帶進度條上傳的解決方案

    asp.net單文件帶進度條上傳的解決方案

    本文介紹的asp.net單文件帶進度條上傳,不屬于任務控件,也不是flash類型的上傳,完全是asp.net、js、css實現(xiàn)上傳,需要的朋友可以參考下
    2015-09-09
  • asp.net6?blazor?文件上傳功能

    asp.net6?blazor?文件上傳功能

    這篇文章主要介紹了asp.net6?blazor?文件上傳,我們今天的所有內(nèi)容,都要依賴這個接口,因為它可以把流直接傳到c#中,這樣我們就可以做很多的騷操作了,需要的朋友可以參考下
    2022-05-05
  • Winform控件SaveFileDialog用于保存文件

    Winform控件SaveFileDialog用于保存文件

    這篇文章主要為大家詳細介紹了Winform SaveFileDialog保存文件對話框的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • asp.net(C#)壓縮圖片,可以指定圖片模板高寬

    asp.net(C#)壓縮圖片,可以指定圖片模板高寬

    今天要在web程序處理圖片,指定圖片的高寬大小。google了一把資料。覺得此方法挺不錯的,大家可以借鑒一下,如果小弟寫的有不對的地方請大家指點一下:以下代碼在winform寫的,在web下測試可以使用。
    2010-03-03
  • .NET裝飾模式講解

    .NET裝飾模式講解

    這篇文章主要為大家詳細介紹了ASP.NET裝飾模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • ASP.NET 5升級后如何刪除舊版本的DNX

    ASP.NET 5升級后如何刪除舊版本的DNX

    這篇文章主要介紹了ASP.NET 5升級后如何刪除舊版本的DNX,其實就是簡單的四步走,就能輕松刪除舊版本的DNX,感興趣的小伙伴們可以參考一下
    2015-11-11

最新評論

新宁县| 自贡市| 克拉玛依市| 化德县| 丰原市| 观塘区| 宁乡县| 辽阳市| 出国| 左贡县| 龙川县| 繁峙县| 罗甸县| 玉环县| 邯郸市| 麻城市| 文化| 武汉市| 元氏县| 南召县| 塔城市| 厦门市| 久治县| 昌乐县| 巴马| 泰和县| 蒲城县| 新巴尔虎右旗| 收藏| 关岭| 读书| 邢台市| 乌兰浩特市| 乡城县| 巴塘县| 华阴市| 天峨县| 岐山县| 唐海县| 剑川县| 张掖市|