一、什麼是熔斷?爲什麼要熔斷?
熔斷就是類似一個保險絲一樣的功能,當Hystrix判定下游服務不可用的時候,發生該服務的調用時,直接返回失敗。
熔斷對微服務來說是必須的,因爲在Java中,每個HTTP請求都會開啓一個新的線程,當下遊服無法正常調用的時候,線程通常會阻塞,一直到Timeout結束,在併發量較大的時候,上游服務所在服務器很可能就會由於阻塞的線程將機器的資源耗盡,導致上游的服務一起掛掉
二、服務降級又是什麼,和熔斷有啥區別?
服務降級是從整個系統的負荷的角度進行考慮,在高負荷的情況下,通過關閉一些非核心接口的業務邏輯,返回一個提前準備好信息(Fallback),爲核心接口騰出資源,保證核心功能的正常運行。這樣做在一段時間內使部分非核心業務無法進行,來保證整個系統的穩定性和可用性。
熔斷與降級的區別:
相同點:
- 目標一致,從可用性和可靠性出發,防止系統的範圍崩潰;
- 用戶體驗相似,用戶會發現部分功能暫時不可用;
不同點:
- 觸發原因:熔斷一般是謀個下游服務服務故障觸發的;降級是由於整個系統的高負荷,針對性阻斷非核心接口;
- 管理的目標層次:熔斷是框架級的,每個微服務都需要的;降級一般是根據業務的重要性進行層級劃分,從外圍服務開始降級;
- 人工干預:熔斷一般是服務交由框架策略自動觸發和恢復的;降級可以通過開關預置,配置中心等手段實現自動,但是有些場景下會進行手動干預降級:比如大型活動的流量到來之前,提前關閉一些非核心功能;
- 粒度:熔斷一般是整個服務不可用;降級會根據業務需求,做到接口級別的降級,比如單個服務保留訂單查詢,降級訂單創建;
三、Hystrix是如何判斷服務是可用的?
上文中我們說到熔斷一般是交由框架斷路器配置,自動判斷進行熔斷的。
Spring Cloud一般是使用Hystrix作爲斷路器,它一共有三種狀態:
- 關閉:起始狀態,所有請求都可以通過,當錯誤請求達到一定的閾值時,狀態轉換爲打開
- 打開:請求直接短路,返回失敗響應信息,經過一段時間後,狀態轉換爲半開
- 半開:該狀態下,如果下次請求成功,則狀態轉換爲關閉,反之轉換爲打開
狀態轉化的判定配置主要有以下三個:
hystrix:
command:
default:
circuitBreaker:
# hystrix打開多長時間之後嘗試恢復(轉爲半開), 默認5s
sleepWindowInMilliseconds: 5
# 配置時間窗口內達到此數量的失敗後,打開hystrix
requestVolumeThreshold: 20
# 失敗率達到百分比之後,打開hystrix
errorThresholdPercentage: 50