網站首頁 編程語言 正文
基本概念
超時、熔斷、限流聽起來好像很遠,但實際上用在方方面面。很多人可能還搞不懂熔斷是做什么,其實可以把熔斷理解為一種防護措施。做個假設,在微服務體系下,某個下游服務響應很慢,然后隨著時間推移,會有越來越多的請求堆積,從而會導致各種嚴重后果,單說連接池大量被占用就很要命。更不用說服務之間還要相互調用,你等我10秒,我等你5秒,不僅毫無體驗感,高可用也就成了空談。不如換個思路:與其等10秒返回一個請求失敗,不如馬上就返回請求失敗。這樣一來,請求堆不起來,資源也有時間釋放或者恢復。這個動作就叫熔斷,或者叫短路。有點像家用電路,一旦有漏電直接跳閘,最大程度保障安全。
熔斷的概念基本有了,接下來給網關集成。這里需要用到一個叫polly的庫。
簡單說下它:polly由.net實現,是一個非常優秀的庫,主要提供重試、熔斷、超時、恢復等功能,當然今天主角不是它,想研究的可以去官方看下:https://github.com/App-vNext/Polly
接下來開始集成。首先添加nuget包:
然后注冊相關服務:
public void ConfigureServices(IServiceCollection services) { services.AddOcelot() .AddPolly() .AddConsul() .AddConfigStoredInConsul(); }
接下來在配置文件添加節點:
"QoSOptions": { "ExceptionsAllowedBeforeBreaking":3, "DurationOfBreak":10000, "TimeoutValue":5000 }
- ExceptionsAllowedBeforeBreaking:閾值,當轉發到下游的服務連續出現的異常次數達到閾值就會觸發熔斷。必須和DurationOfBreak一起設置。
- DurationOfBreak:熔斷持續時間,單位毫秒。必須和ExceptionsAllowedBeforeBreaking一起設置。
- TimeoutValue:限定時間內未響應的請求直接超時,單位毫秒。可以單獨設置
- tips:ocelot默認超時時間是90秒,90秒啊
然后寫一個方法,休眠10秒:
[HttpGet] public IActionResult TimeOut() { System.Threading.Thread.Sleep(10000); return Ok(); }
超時
準備工作做完了,現在調用timeout方法:
方法是休眠10秒,但是等待5秒左右就主動返回了503,說明超時的設置已經生效。
熔斷
當轉發到下游某個服務的請求連續出現超時情況時,網關就會判斷是否達到閾值,如果是就觸發熔斷,在此期間的請求統一返回503,熔斷時間過了以后恢復正常。按上面配置來看:連續超時3次會觸發熔斷,熔斷持續10秒。我們仍然調用Timeout方法,連續3次以后:
沒有觸發熔斷時,只能等過5秒自動超時,很顯然現在已經觸發了超時,所以在200毫秒就直接返回了結果。熔斷期間訪問別的方法也會是503:
和開頭寫的一樣,熔斷和電路短路跳閘是思路是一樣的,就算家里N條線只有1條漏電,那還是會跳閘整個屋子不能用電,這種做法最大程度上保證了程序安全。
限流
假設現在只能承載1萬并發,那么過來5萬并發會怎么樣?一般情況下,只要持續時間稍久一些,服務基本全都掛了。這種情況在生產環境難免會發生,畢竟業務量也無法測算那么精準。所以為了提高可用性,瞬時請求超過最大閾值,其他的全都忽略才能保證服務安全可用。讓客戶等下一次請求,總好過服務掛了沒的請求。
限流也是配置就能實現,在路由中新增下面的節點:
"RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 1, "Limit": 1 }
- ClientWhitelist:客戶端白名單,白名單不受限流規則限制。
- EnableRateLimiting:是否啟用限流。
- Period:周期,單位有s(秒)、m(分)、h(時)、d(天),比如1h
- PeriodTimespan:多少秒后重試。
- Limit:周期內允許多少個請求。
想要更精細的控制,還可以在Global部分添加這些:
"RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "Customize Tips!", "HttpStatusCode": 999, "ClientIdHeader" : "Test" }
- DisableRateLimitHeaders:是否禁用X-Rate-Limit、Retry-After標頭。
- QuotaExceededMessage:觸發限流時返回的消息。
- HttpStatusCode:觸發限流時返回的http狀態碼(一般會寫429)。
- ClientIdHeader:用來識別客戶端的標頭。
- tips:DisableRateLimitHeaders中提到的X-Rate-Limit、Retry-After:X-Rate-Limit——標準時間內允許多少個請求,Retry-After——觸發限流以后多久可以重試。
接下來修改我的配置:
"RateLimitOptions": { "ClientWhitelist": [ "myclient" ], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 10, "Limit": 1 }
修改全局配置:
"RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "123123", "HttpStatusCode": 429, "ClientIdHeader": "Test" }
按配置來看,我設置1秒內最多允許1個請求,超過就觸發限流。之后的請求都會返回429和123123,持續10秒。來試試:
等待10秒后再次請求,恢復正常:
白名單
白名單里的客戶端是不會受到限流限制的。按照配置添加請求頭,就可以被白名單識別:
請求時添加這個請求頭,無論怎么刷都不會被限流。
超時、熔斷、限流的必要性和好處是不言而喻的,但是上生產一定要注意配置的合理性,充分綜合業務場景和需要才是王道,畢竟技術如果不解決問題那就毫無意義。
原文鏈接:https://www.cnblogs.com/muchengqingxin/p/15547605.html
相關推薦
- 2022-11-16 python壓縮和解壓縮模塊之zlib的用法_python
- 2022-07-19 react組件通訊的三種方式props:父組件和子組件互相通訊、兄弟組件通訊
- 2022-05-13 python魔法方法之__setattr__()_python
- 2022-10-21 React配置多個代理實現數據請求返回問題_React
- 2021-11-21 CentOS7環境中DHCP配置教程_Linux
- 2022-11-14 react裝飾器與高階組件及簡單樣式修改的操作詳解_React
- 2022-05-01 Entity?Framework系統架構與原理介紹_基礎應用
- 2022-06-21 C#實現Array,List,Dictionary相互轉換_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支