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