限流和緩存是網關中兩個很是重要的功能,前者是保障服務更可靠地運行,後者則能夠大大提升應用的吞吐能力。Beetlex.Bumblebee微服務網關提供了兩個擴展插件來實現這兩個功能,分別是BeetleX.Bumblebee.ConcurrentLimits和BeetleX.Bumblebee.Caching。ConcurrentLimits提供IP或不一樣Url的併發限流策略,而Caching則能夠根據不一樣Url來配置不一樣的緩存策略。接下來介紹這兩個插件的使用和配置。linux
Bumblebee
中使用JWT
須要引用兩個插件,分別是Bumblebee.Configuration,BeetleX.Bumblebee.ConcurrentLimits
和BeetleX.Bumblebee.Caching
。加載啓動後就能夠經過管理工具進行插件配置.git
g = new Gateway(); g.HttpOptions( o => { o.Port = 80; o.LogToConsole = true; o.LogLevel = BeetleX.EventArgs.LogType.Error; }); g.Open(); g.LoadPlugin( typeof(Bumblebee.Configuration.Management).Assembly, typeof(Bumblebee.Caching.default_request_cached_reader).Assembly, typeof(Bumblebee.ConcurrentLimits.UrlConcurrentLimits).Assembly );
以上只是代碼引用插件,建議直接下載運行版本:https://github.com/IKende/Bumblebee/blob/master/bin/ (支持windows/linux .net core 2.1或更高版本)github
引用插件後就能夠在插件管理查看到這兩個插件,大部分插件默認是關閉。json
這是針對一個IP併發請求的限制,它能夠限制一個IP每秒併發的數量,若是超出這個數量那這個IP則會被禁止訪問一段時間。爲了更好的解決實際狀況項配置里加入了白名單設置用來排除相關IP或IP範圍的限制,接下來經過一個配置來描述這個插件的使用.windows
{ "Limit": 100, "DisabledTime": 100, "CleanTime": 1800, "WhiteList": [ "192.168.1.1/24", "192.168.2.18" ] }
以上配置是對每一個IP每秒併發限制在100次,但排除 "192.168.1.1/24"和"192.168.2.18".接下來看一下測試結果api
以上是使用192.168.2.19
進行兩次壓測的結果,第一次壓測觸發了限制,而後99%的請求被拒絕;而後接下來的一次測試的全部請求都被拒絕了。從結果上來看每秒的20萬rps都被認爲是非法,能夠想像這些壓力流入到正常服務中會產生有多大的損耗!接下來測試白名單IP緩存
從正常測試來看,上游的服務每秒只能處理4萬的rps,因此併發控制是會起到很是好的擋洪效果。服務器
這是針對不一樣Url制定不一樣併發限制的插件,在一個服務中不免有些API
須要處理複雜的邏輯而佔用大量的資源,若是這些接口的併發過量可能對整個服務的資源使用受到影響。經過這個插件能夠限制某些API
的併發數量,從而控制其它對總體資源的影響。下面看一下簡單的示例配置網絡
{ "UrlLimits": [ { "Url": "^/jso.*", "Rps": 300 }, { "Url": "^/emp.*", "Rps": 100 } ], "CleanTime": 1800 }
以上配置兩組Url併發限制,限制秒請求量分別是300和100.配置完成後設置生產看一下壓測結果併發
/Json
併發限制是每秒300
測試了5秒多,有1800
個請求是成功能的,其餘99萬屢次是被拒絕
/Employee/2
併發限制是每秒100
測試了5秒多,有600
個請求是成功能的,其餘99萬屢次是被拒絕
緩存插件有兩部分,分別是寫入和讀取;當寫入開啓後讀取才能生效。緩存配置只須要配置寫入插件便可,讀取插件無需配置。
插件能夠針對不一樣請求的路徑來制定緩存策略,制定也很是方便內容以下:
{ "Caches": [ { "Url": "^/jso.*", "TimeOut": 100 }, { "Url": "^/api.*", "TimeOut": 200 } ], "WhiteList": [ "192.168.2.1/24" ] }
這個緩存插件配置簡單,只須要針對不一樣Url
配置相應的正常和緩存超時時間便可(單位秒);WhiteList
是一個緩存操做的受權白名單。這個緩存的機制是使用.net core的MemoryCache
,若是須要使用Redis
則須要擴展引入,針對密集處理的網關一級緩存仍是在本地內存會高效不少。
爲了檢測網關層面緩存的效果,因此對插件進行了一個壓力測試;爲了確保緩存發揮比較大的做用因此這個測試在10Gb網絡下面進行(網關服務器則是E3-1230V2的老機器),這樣能夠更好的突出緩存在沒有帶寬限制狀況達到的應用效果。測試分別是獲取不一樣大小的數據列表在關閉和開啓緩存的不一樣差別。
以上是插件顯示的併發狀況,前面是沒有開啓緩存併發在4萬rps左右,帶寬是500Mb上下;但開啓緩存後併發達到了20萬以上rps(插件走勢圖最大顯示併發只有10萬rps),帶寬接近3Gb.
以上是插件顯示的併發狀況,前面是沒有開啓緩存併發在2萬rps左右,帶寬是1Gb上下;但開啓緩存後併發達到了17萬rps(插件走勢圖最大顯示併發只有10萬rps),帶寬接近8Gb上下.
整體上來講若是網關緩存開啓其收益是很是明顯的,這個時候限制服務併發輸出的多是出口的帶寬。
插件安裝後會提供兩個接口來刪除某個Url對應的緩存,或清除全部緩存;這兩個接口的訪問權IP必須在白名單中描述否而無權操做。
http://host/__system/bumblebee/cache/remove?url=緩存對應的url
http://host/__system/bumblebee/cache/clean