.Net?Core微服務網(wǎng)關Ocelot超時、熔斷、限流
基本概念
超時、熔斷、限流聽起來好像很遠,但實際上用在方方面面。很多人可能還搞不懂熔斷是做什么,其實可以把熔斷理解為一種防護措施。做個假設,在微服務體系下,某個下游服務響應很慢,然后隨著時間推移,會有越來越多的請求堆積,從而會導致各種嚴重后果,單說連接池大量被占用就很要命。更不用說服務之間還要相互調(diào)用,你等我10秒,我等你5秒,不僅毫無體驗感,高可用也就成了空談。不如換個思路:與其等10秒返回一個請求失敗,不如馬上就返回請求失敗。這樣一來,請求堆不起來,資源也有時間釋放或者恢復。這個動作就叫熔斷,或者叫短路。有點像家用電路,一旦有漏電直接跳閘,最大程度保障安全。
熔斷的概念基本有了,接下來給網(wǎng)關集成。這里需要用到一個叫polly的庫。
簡單說下它:polly由.net實現(xiàn),是一個非常優(yōu)秀的庫,主要提供重試、熔斷、超時、恢復等功能,當然今天主角不是它,想研究的可以去官方看下:https://github.com/App-vNext/Polly
接下來開始集成。首先添加nuget包:

然后注冊相關服務:
public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot()
.AddPolly()
.AddConsul()
.AddConfigStoredInConsul();
}接下來在配置文件添加節(jié)點:
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking":3,
"DurationOfBreak":10000,
"TimeoutValue":5000
}- ExceptionsAllowedBeforeBreaking:閾值,當轉發(fā)到下游的服務連續(xù)出現(xiàn)的異常次數(shù)達到閾值就會觸發(fā)熔斷。必須和DurationOfBreak一起設置。
- DurationOfBreak:熔斷持續(xù)時間,單位毫秒。必須和ExceptionsAllowedBeforeBreaking一起設置。
- TimeoutValue:限定時間內(nèi)未響應的請求直接超時,單位毫秒。可以單獨設置
- tips:ocelot默認超時時間是90秒,90秒啊
然后寫一個方法,休眠10秒:
[HttpGet]
public IActionResult TimeOut()
{
System.Threading.Thread.Sleep(10000);
return Ok();
}超時
準備工作做完了,現(xiàn)在調(diào)用timeout方法:

方法是休眠10秒,但是等待5秒左右就主動返回了503,說明超時的設置已經(jīng)生效。
熔斷
當轉發(fā)到下游某個服務的請求連續(xù)出現(xiàn)超時情況時,網(wǎng)關就會判斷是否達到閾值,如果是就觸發(fā)熔斷,在此期間的請求統(tǒng)一返回503,熔斷時間過了以后恢復正常。按上面配置來看:連續(xù)超時3次會觸發(fā)熔斷,熔斷持續(xù)10秒。我們?nèi)匀徽{(diào)用Timeout方法,連續(xù)3次以后:

沒有觸發(fā)熔斷時,只能等過5秒自動超時,很顯然現(xiàn)在已經(jīng)觸發(fā)了超時,所以在200毫秒就直接返回了結果。熔斷期間訪問別的方法也會是503:

和開頭寫的一樣,熔斷和電路短路跳閘是思路是一樣的,就算家里N條線只有1條漏電,那還是會跳閘整個屋子不能用電,這種做法最大程度上保證了程序安全。
限流
假設現(xiàn)在只能承載1萬并發(fā),那么過來5萬并發(fā)會怎么樣?一般情況下,只要持續(xù)時間稍久一些,服務基本全都掛了。這種情況在生產(chǎn)環(huán)境難免會發(fā)生,畢竟業(yè)務量也無法測算那么精準。所以為了提高可用性,瞬時請求超過最大閾值,其他的全都忽略才能保證服務安全可用。讓客戶等下一次請求,總好過服務掛了沒的請求。
限流也是配置就能實現(xiàn),在路由中新增下面的節(jié)點:
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 1
}- ClientWhitelist:客戶端白名單,白名單不受限流規(guī)則限制。
- EnableRateLimiting:是否啟用限流。
- Period:周期,單位有s(秒)、m(分)、h(時)、d(天),比如1h
- PeriodTimespan:多少秒后重試。
- Limit:周期內(nèi)允許多少個請求。
想要更精細的控制,還可以在Global部分添加這些:
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "Customize Tips!",
"HttpStatusCode": 999,
"ClientIdHeader" : "Test"
}- DisableRateLimitHeaders:是否禁用X-Rate-Limit、Retry-After標頭。
- QuotaExceededMessage:觸發(fā)限流時返回的消息。
- HttpStatusCode:觸發(fā)限流時返回的http狀態(tài)碼(一般會寫429)。
- ClientIdHeader:用來識別客戶端的標頭。
- tips:DisableRateLimitHeaders中提到的X-Rate-Limit、Retry-After:X-Rate-Limit——標準時間內(nèi)允許多少個請求,Retry-After——觸發(fā)限流以后多久可以重試。
接下來修改我的配置:
"RateLimitOptions": {
"ClientWhitelist": [ "myclient" ],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 10,
"Limit": 1
}修改全局配置:
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "123123",
"HttpStatusCode": 429,
"ClientIdHeader": "Test"
}按配置來看,我設置1秒內(nèi)最多允許1個請求,超過就觸發(fā)限流。之后的請求都會返回429和123123,持續(xù)10秒。來試試:

等待10秒后再次請求,恢復正常:

白名單
白名單里的客戶端是不會受到限流限制的。按照配置添加請求頭,就可以被白名單識別:

請求時添加這個請求頭,無論怎么刷都不會被限流。
超時、熔斷、限流的必要性和好處是不言而喻的,但是上生產(chǎn)一定要注意配置的合理性,充分綜合業(yè)務場景和需要才是王道,畢竟技術如果不解決問題那就毫無意義。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core為Ocelot網(wǎng)關配置Swagger
- ASP.NET?Core設置Ocelot網(wǎng)關限流
- ASP.NET?Core中的Ocelot網(wǎng)關介紹
- .Net?Core微服務網(wǎng)關Ocelot集成Consul
- .Net?Core微服務網(wǎng)關Ocelot基礎介紹及集成
- ASP.NET Core Api網(wǎng)關Ocelot的使用初探
- ASP.NET Core3.1 Ocelot負載均衡的實現(xiàn)
- ASP.NET Core3.1 Ocelot認證的實現(xiàn)
- ASP.NET Core3.1 Ocelot路由的實現(xiàn)
- Asp.Net?Core使用Ocelot結合Consul實現(xiàn)服務注冊和發(fā)現(xiàn)
相關文章
在ASP.NET 2.0中操作數(shù)據(jù)之三十五:使用Repeater和DataList單頁面實現(xiàn)主/從報表
前面已經(jīng)介紹了ASP.NET 2.0中如何使用兩個頁面實現(xiàn)主/從報表,本文主要講解,如何使用一個單獨頁面實現(xiàn)主/從報表。2016-05-05
.Net?Core微服務網(wǎng)關Ocelot集成Consul
這篇文章介紹了.Net?Core微服務網(wǎng)關Ocelot集成Consul的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-01-01
在ASP.NET 2.0中操作數(shù)據(jù)之四十五:DataList和Repeater里的自定義Button
本文主要介紹在DataList和Repeater添加諸如Button,LinkButton和ImageButton等控件的方法,并根據(jù)相關控件CommandName屬性觸發(fā)相應的事件,執(zhí)行相應的操作。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之六十七:在TableAdapters中使用JOINs
使用TableAdapter向?qū)в幸欢ǖ木窒扌?,只能?chuàng)建出不含JOIN的存儲過程,那么本文就為大家講解,如何在TableAdapters中使用包含JOIN的存儲過程。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之三十四:基于DataList和Repeater跨頁面的主/從報表
前面介紹了使用GridView實現(xiàn)跨頁面的主/從報表,同樣DataList和Repeater也可以實現(xiàn)相同功能。2016-05-05
.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法
.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法...2007-12-12

