當一個服務調用另一個服務由于網絡原因或自身原因出現問題,調用者就會等待被調用者的響應;當更多的服務請求到這些資源導致更多的請求等待,發生連鎖效應(雪崩效應)。
斷路器有三種狀態
1)打開狀態:一段時間內 達到一定的次數無法調用 并且多次監測沒有恢復的跡象 斷路器完全打開 那么下次請求就不會請求到該服務;
2)半開狀態:短時間內 有恢復跡象 斷路器會將部分請求發給該服務,正常調用時斷路器關閉;
3)關閉狀態:當服務一直處于正常狀態 能正常調用;
Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,在分布式系統里,許多依賴不可避免的會調用失敗,比如超時、異常等。當某個服務單元發生故障之后,熔斷器會向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地占用,從而避免了故障在分布式系統中的蔓延,乃至雪崩,以提高分布式系統的彈性。5秒內20次調用失敗就會啟動熔斷機制。熔斷機制的注解是@HystrixCommand。
服務降級:接口調用失敗就調用本地的方法返回一個空
服務熔斷:接口調用失敗就會進入調用接口提前定義好的一個熔斷的方法,返回錯誤信息
服務隔離:隔離服務之間相互影響
服務監控:在服務發生調用時,會將每秒請求數、成功請求數等運行指標記錄下來。
雪崩效應是在大型互聯網項目中,當某個服務發生宕機時,調用這個服務的其他服務也會發生宕機,大型項目的微服務之間的調用是互通的,這樣就會將服務的不可用逐步擴大到各個其他服務中,從而使整個項目的服務宕機崩潰.發生雪崩效應的原因有以下幾點
1)單個服務的代碼存在bug.
2)請求訪問量激增導致服務發生崩潰(如大型商城的槍紅包,秒殺功能).
3)服務器的硬件故障也會導致部分服務不可用.
一般使用使用Hystrix框架,實現服務隔離來避免出現服務的雪崩效應,從而達到保護服務的效果。當微服務中,高并發的數據庫訪問量導致服務線程阻塞,使單個服務宕機,服務的不可用會蔓延到其他服務,引起整體服務災難性后果,使用服務降級能有效為不同的服務分配資源,一旦服務不可用則返回友好提示,不占用其他服務資源,從而避免單個服務崩潰引發整體服務的不可用.
因為Tomcat默認情況下只有一個線程池來維護客戶端發送的所有的請求,這時候某一接口在某一時刻被大量訪問就會占據tomcat線程池中的所有線程,其他請求處于等待狀態,無法連接到服務接口。
1)服務降級:當客戶端請求服務器端的時候,防止客戶端一直等待,不會處理業務邏輯代碼,直接返回一個友好的提示給客戶端。
2)服務熔斷是在服務降級的基礎上更直接的一種保護方式,當在一個統計時間范圍內的請求失敗數量達到設定值(requestVolumeThreshold)或當前的請求錯誤率達到設定的錯誤率閾值(errorThresholdPercentage)時開啟斷路,之后的請求直接走fallback方法,在設定時間(sleepWindowInMilliseconds)后嘗試恢復。
3)服務隔離就是Hystrix為隔離的服務開啟一個獨立的線程池,這樣在高并發的情況下不會影響其他服務。服務隔離有線程池和信號量兩種實現方式,一般使用線程池方式。
Hystrix實現服務降級的功能是通過重寫HystrixCommand中的getFallback()方法,當Hystrix的run方法或construct執行發生錯誤時轉而執行getFallback()方法。