.Net?Core微服務(wù)網(wǎng)關(guān)Ocelot超時(shí)、熔斷、限流
基本概念
超時(shí)、熔斷、限流聽起來好像很遠(yuǎn),但實(shí)際上用在方方面面。很多人可能還搞不懂熔斷是做什么,其實(shí)可以把熔斷理解為一種防護(hù)措施。做個(gè)假設(shè),在微服務(wù)體系下,某個(gè)下游服務(wù)響應(yīng)很慢,然后隨著時(shí)間推移,會(huì)有越來越多的請(qǐng)求堆積,從而會(huì)導(dǎo)致各種嚴(yán)重后果,單說連接池大量被占用就很要命。更不用說服務(wù)之間還要相互調(diào)用,你等我10秒,我等你5秒,不僅毫無體驗(yàn)感,高可用也就成了空談。不如換個(gè)思路:與其等10秒返回一個(gè)請(qǐng)求失敗,不如馬上就返回請(qǐng)求失敗。這樣一來,請(qǐng)求堆不起來,資源也有時(shí)間釋放或者恢復(fù)。這個(gè)動(dòng)作就叫熔斷,或者叫短路。有點(diǎn)像家用電路,一旦有漏電直接跳閘,最大程度保障安全。
熔斷的概念基本有了,接下來給網(wǎng)關(guān)集成。這里需要用到一個(gè)叫polly的庫(kù)。
簡(jiǎn)單說下它:polly由.net實(shí)現(xiàn),是一個(gè)非常優(yōu)秀的庫(kù),主要提供重試、熔斷、超時(shí)、恢復(fù)等功能,當(dāng)然今天主角不是它,想研究的可以去官方看下:https://github.com/App-vNext/Polly
接下來開始集成。首先添加nuget包:
然后注冊(cè)相關(guān)服務(wù):
public void ConfigureServices(IServiceCollection services) { services.AddOcelot() .AddPolly() .AddConsul() .AddConfigStoredInConsul(); }
接下來在配置文件添加節(jié)點(diǎn):
"QoSOptions": { "ExceptionsAllowedBeforeBreaking":3, "DurationOfBreak":10000, "TimeoutValue":5000 }
- ExceptionsAllowedBeforeBreaking:閾值,當(dāng)轉(zhuǎn)發(fā)到下游的服務(wù)連續(xù)出現(xiàn)的異常次數(shù)達(dá)到閾值就會(huì)觸發(fā)熔斷。必須和DurationOfBreak一起設(shè)置。
- DurationOfBreak:熔斷持續(xù)時(shí)間,單位毫秒。必須和ExceptionsAllowedBeforeBreaking一起設(shè)置。
- TimeoutValue:限定時(shí)間內(nèi)未響應(yīng)的請(qǐng)求直接超時(shí),單位毫秒??梢詥为?dú)設(shè)置
- tips:ocelot默認(rèn)超時(shí)時(shí)間是90秒,90秒啊
然后寫一個(gè)方法,休眠10秒:
[HttpGet] public IActionResult TimeOut() { System.Threading.Thread.Sleep(10000); return Ok(); }
超時(shí)
準(zhǔn)備工作做完了,現(xiàn)在調(diào)用timeout方法:
方法是休眠10秒,但是等待5秒左右就主動(dòng)返回了503,說明超時(shí)的設(shè)置已經(jīng)生效。
熔斷
當(dāng)轉(zhuǎn)發(fā)到下游某個(gè)服務(wù)的請(qǐng)求連續(xù)出現(xiàn)超時(shí)情況時(shí),網(wǎng)關(guān)就會(huì)判斷是否達(dá)到閾值,如果是就觸發(fā)熔斷,在此期間的請(qǐng)求統(tǒng)一返回503,熔斷時(shí)間過了以后恢復(fù)正常。按上面配置來看:連續(xù)超時(shí)3次會(huì)觸發(fā)熔斷,熔斷持續(xù)10秒。我們?nèi)匀徽{(diào)用Timeout方法,連續(xù)3次以后:
沒有觸發(fā)熔斷時(shí),只能等過5秒自動(dòng)超時(shí),很顯然現(xiàn)在已經(jīng)觸發(fā)了超時(shí),所以在200毫秒就直接返回了結(jié)果。熔斷期間訪問別的方法也會(huì)是503:
和開頭寫的一樣,熔斷和電路短路跳閘是思路是一樣的,就算家里N條線只有1條漏電,那還是會(huì)跳閘整個(gè)屋子不能用電,這種做法最大程度上保證了程序安全。
限流
假設(shè)現(xiàn)在只能承載1萬并發(fā),那么過來5萬并發(fā)會(huì)怎么樣?一般情況下,只要持續(xù)時(shí)間稍久一些,服務(wù)基本全都掛了。這種情況在生產(chǎn)環(huán)境難免會(huì)發(fā)生,畢竟業(yè)務(wù)量也無法測(cè)算那么精準(zhǔn)。所以為了提高可用性,瞬時(shí)請(qǐng)求超過最大閾值,其他的全都忽略才能保證服務(wù)安全可用。讓客戶等下一次請(qǐng)求,總好過服務(wù)掛了沒的請(qǐng)求。
限流也是配置就能實(shí)現(xiàn),在路由中新增下面的節(jié)點(diǎn):
"RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 1, "Limit": 1 }
- ClientWhitelist:客戶端白名單,白名單不受限流規(guī)則限制。
- EnableRateLimiting:是否啟用限流。
- Period:周期,單位有s(秒)、m(分)、h(時(shí))、d(天),比如1h
- PeriodTimespan:多少秒后重試。
- Limit:周期內(nèi)允許多少個(gè)請(qǐng)求。
想要更精細(xì)的控制,還可以在Global部分添加這些:
"RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "Customize Tips!", "HttpStatusCode": 999, "ClientIdHeader" : "Test" }
- DisableRateLimitHeaders:是否禁用X-Rate-Limit、Retry-After標(biāo)頭。
- QuotaExceededMessage:觸發(fā)限流時(shí)返回的消息。
- HttpStatusCode:觸發(fā)限流時(shí)返回的http狀態(tài)碼(一般會(huì)寫429)。
- ClientIdHeader:用來識(shí)別客戶端的標(biāo)頭。
- tips:DisableRateLimitHeaders中提到的X-Rate-Limit、Retry-After:X-Rate-Limit——標(biāo)準(zhǔn)時(shí)間內(nèi)允許多少個(gè)請(qǐng)求,Retry-After——觸發(fā)限流以后多久可以重試。
接下來修改我的配置:
"RateLimitOptions": { "ClientWhitelist": [ "myclient" ], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 10, "Limit": 1 }
修改全局配置:
"RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "123123", "HttpStatusCode": 429, "ClientIdHeader": "Test" }
按配置來看,我設(shè)置1秒內(nèi)最多允許1個(gè)請(qǐng)求,超過就觸發(fā)限流。之后的請(qǐng)求都會(huì)返回429和123123,持續(xù)10秒。來試試:
等待10秒后再次請(qǐng)求,恢復(fù)正常:
白名單
白名單里的客戶端是不會(huì)受到限流限制的。按照配置添加請(qǐng)求頭,就可以被白名單識(shí)別:
請(qǐng)求時(shí)添加這個(gè)請(qǐng)求頭,無論怎么刷都不會(huì)被限流。
超時(shí)、熔斷、限流的必要性和好處是不言而喻的,但是上生產(chǎn)一定要注意配置的合理性,充分綜合業(yè)務(wù)場(chǎng)景和需要才是王道,畢竟技術(shù)如果不解決問題那就毫無意義。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core為Ocelot網(wǎng)關(guān)配置Swagger
- ASP.NET?Core設(shè)置Ocelot網(wǎng)關(guān)限流
- ASP.NET?Core中的Ocelot網(wǎng)關(guān)介紹
- .Net?Core微服務(wù)網(wǎng)關(guān)Ocelot集成Consul
- .Net?Core微服務(wù)網(wǎng)關(guān)Ocelot基礎(chǔ)介紹及集成
- ASP.NET Core Api網(wǎng)關(guān)Ocelot的使用初探
- ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn)
- ASP.NET Core3.1 Ocelot認(rèn)證的實(shí)現(xiàn)
- ASP.NET Core3.1 Ocelot路由的實(shí)現(xiàn)
- Asp.Net?Core使用Ocelot結(jié)合Consul實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)
相關(guān)文章
ASP.NET 2.0中的數(shù)據(jù)操作之八:使用兩個(gè)DropDownList過濾的主/從報(bào)表
本文主要介紹在ASP.NET 2.0中如何如何將DropDownList和另一個(gè)DropDownList控件關(guān)聯(lián),選擇產(chǎn)品分類和具體的產(chǎn)品時(shí),使用DetailsView顯示產(chǎn)品的詳細(xì)信息。2016-05-05解讀ASP.NET 5 & MVC6系列教程(14):View Component
這篇文章主要介紹了ASP.NET 5 MVC6 中View Component創(chuàng)建和視圖的使用,需要的朋友可以參考下2016-06-06解讀ASP.NET 5 & MVC6系列教程(13):TagHelper
這篇文章主要介紹了新版MVC6中強(qiáng)大的TagHelper功能,需要的朋友可以參考下2016-06-06.NET?6線程池ThreadPool實(shí)現(xiàn)概述
本文詳細(xì)講解了.NET?6線程池ThreadPool的實(shí)現(xiàn)方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11在ASP.NET 2.0中操作數(shù)據(jù)之三十九:在DataList的編輯界面里添加驗(yàn)證控件
為了防止用戶非法的輸入,這節(jié)主要介紹如何在編輯數(shù)據(jù)的時(shí)候添加驗(yàn)證控件,以避免出現(xiàn)異常和保證數(shù)據(jù)的完整性。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之十八:在ASP.NET頁(yè)面中處理BLL/DAL層的異常
本文主要介紹ASP.NET 2.0中如何在頁(yè)面中處理BLL和DAL層的異常,程序演示了如何在頁(yè)面中顯示友好的異常信息,以及講解了如何在DAL層拋出自定義異常。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之六:編程設(shè)置ObjectDataSource的參數(shù)值
本文主要介紹在ObjectDataSource控件的Selecting事件中,設(shè)置InputParameters參數(shù),配合業(yè)務(wù)層的查詢方法,以達(dá)到查詢不同數(shù)據(jù)的目的。2016-04-04在ASP.NET 2.0中操作數(shù)據(jù)之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)
前面介紹搭建基礎(chǔ)的架構(gòu),下面我們來介紹ASP.NET中,如何利用ObjectDataSource來展現(xiàn)數(shù)據(jù)。通過配置ObjectDataSource,我們指定這些底層的對(duì)象,還有這些對(duì)象的方法如何映射到ObjectDataSource的Select、Insert、Update和Delete方法。2016-04-04NopCommerce架構(gòu)分析之(六)自定義RazorViewEngine和WebViewPage
本文對(duì)NopCommerce的后臺(tái)分離技術(shù)做簡(jiǎn)單的探討。NopCommerce通過自定義視圖引擎,重寫了VirtualPathProviderViewEngine類的CreateView、CreatePartialView、FindView、FindPartialView方法,添加自定義的視圖搜索路徑來實(shí)現(xiàn)后臺(tái)分離。2016-04-04在ASP.NET 2.0中操作數(shù)據(jù)之三十三:基于DataList和Repeater使用DropDownList過濾的主/
前面已經(jīng)介紹過使用DropDownList過濾的主/從報(bào)表,不過當(dāng)時(shí)是基于GridView,本文算是復(fù)習(xí)一下,基于DataList和Repeater再次實(shí)現(xiàn)一下相同的功能。2016-05-05