微服務(wù)之容錯保護

簡介

? ? ? ? 在微服務(wù)架構(gòu)中,由于將單體應(yīng)用進行服務(wù)拆分,各服務(wù)之間功能盡可能保持單一職責(zé),然而在響應(yīng)用戶請求結(jié)果時,常常是通過眾多服務(wù)互相調(diào)用形成的,由于每個單元都運行在不同的進程中(不同的微服務(wù)),服務(wù)依賴之間通過遠(yuǎn)程調(diào)用方式進行,這樣很有可能因為網(wǎng)絡(luò)原因或者微服務(wù)本身故障出現(xiàn)調(diào)用延遲,而這又會導(dǎo)致調(diào)用方出現(xiàn)延遲,此時,如果用戶請求不斷增加,極有可能出現(xiàn)過多的服務(wù)調(diào)用放等待,一個服務(wù)占用一個線程,線程過多可能導(dǎo)致服務(wù)器奔潰,造成嚴(yán)重的后果。

? ? ? ? 我們常把因服務(wù)容錯性不好,由于某一服務(wù)出現(xiàn)問題引起大量用戶請求等待,導(dǎo)致服務(wù)器宕機的情況稱為“雪崩效應(yīng)”。比如:單點登錄服務(wù)調(diào)用用戶信息服務(wù)查詢用戶信息,由于用戶信息服務(wù)無法提供服務(wù)導(dǎo)致單點登錄服務(wù)一直等待,從而導(dǎo)致用戶登錄、用戶退出功能無法使用,像這樣由一個服務(wù)所引起的一連串的多個服務(wù)無法提供服務(wù)即是微服務(wù)的雪崩效應(yīng)。

圖片來自個人微信公眾號
圖片來自個人微信公眾號


圖片來自個人微信公眾號

? ? ? ? 我們可將服務(wù)雪崩的參與者簡化為 服務(wù)提供者 和 服務(wù)調(diào)用者, 并將服務(wù)雪崩產(chǎn)生的過程分為以下三個階段來分析形成的原因:

(1)服務(wù)提供者不可用:程序bug、用戶大量請求

(2)重試加大流量:用戶重試、代碼邏輯重試

(3)服務(wù)調(diào)用者不可用:資源耗盡,當(dāng)服務(wù)調(diào)用者使用 同步調(diào)用 時,會產(chǎn)生大量的等待線程占用系統(tǒng)資源

圖片來自個人微信公眾號

容錯保護(Hystrix)

? ? ? ? 為了防止“雪崩效應(yīng)”,我們必須提供一個容錯機制,當(dāng)調(diào)用延遲超過一定時間時,可以采取一定措施處理,而不是讓其一直處于等待狀態(tài),簡單來說,該機制主要實現(xiàn)點如下:

1.為網(wǎng)絡(luò)請求設(shè)置超時時間:

? ? ? ? 主要是防止因服務(wù)故障或網(wǎng)絡(luò)延遲導(dǎo)致請求堆積,占用服務(wù)器資源;

2.使用斷路器模式:

? ? ? ? 當(dāng)調(diào)用出錯或者超時,服務(wù)可以將此請求標(biāo)記為失敗,給調(diào)用方返回信息提示,即調(diào)用失敗處理方法。熔斷機制可以很好理解,想想家里的電路熔斷器,一旦電路發(fā)生短路,立即切斷電路,保護人身財產(chǎn)安全。

原理

? ? ? ? Spring CloudHystrix 是基于Netflix的開源框架Hystrix的整合,是一個開源的容錯庫,用戶隔離訪問遠(yuǎn)程服務(wù),防止級聯(lián)失敗,它實現(xiàn)了斷路器、線程隔離、信號隔離等容錯功能,能夠在一個、或多個依賴同時出現(xiàn)問題時保證系統(tǒng)依然可用。如下是Hystrix斷路器示意圖:

圖片來自個人微信公眾號
圖片來自個人微信公眾號

概念理解

? ? ? ? 熔斷:切斷項目對指定服務(wù)的調(diào)用。

? ? ? ? 降級:當(dāng)某個服務(wù)熔斷之后,服務(wù)器將不再被調(diào)用,此時客戶端可以自己準(zhǔn)備一個本地的fallback回調(diào),返回一個缺省值。

? ? ? ? 依賴隔離:使用艙壁模式實現(xiàn)線程池的隔離,它會為每 一個依賴服務(wù)創(chuàng)建 一個獨立的線程池, 這樣就算某個依賴服務(wù)出現(xiàn)延遲過高的情況, 也只是對該依賴服務(wù)的調(diào)用產(chǎn)生影響, 而不會拖慢其他的依賴服務(wù)。

? ? ? ? 備注:不用擔(dān)心為每一個依賴服務(wù)都分配一個線程池是否會過多地增加系統(tǒng)的負(fù)載和開銷。

配置步驟

(1)添加Hystrix依賴,非常簡單:

圖片來自個人微信公眾號

(2)在啟動類添加@enableHystrix注解,開啟容錯保護功能:

圖片來自個人微信公眾號

(3)使用Hystrix實現(xiàn)容錯,注解配置服務(wù)降級:

服務(wù)降級執(zhí)行方式

(1)同步執(zhí)行:即一旦開始執(zhí)行該命令,當(dāng)前線程就得阻塞著直到該命令返回結(jié)果,然后才能繼續(xù)執(zhí)行下面的邏輯。當(dāng)調(diào)用命令的execute()方法即為同步執(zhí)行。

圖片來自個人微信公眾號

(2)異步執(zhí)行:命令開始執(zhí)行會返回一個Future的對象,不阻塞后面的邏輯,開發(fā)者自己根據(jù)需要去獲取結(jié)果。當(dāng)調(diào)用HystrixCommand的queue()方法即為異步執(zhí)行。

圖片來自個人微信公眾號

(3)響應(yīng)式執(zhí)行:命令開始執(zhí)行會返回一個Observable 對象,開發(fā)者可以給給Obeservable對象注冊上Observer或者Action1對象,響應(yīng)式地處理命令執(zhí)行過程中的不同階段。當(dāng)調(diào)用HystrixCommand的observe()方法,或使用Observable的工廠方法(just(),from())即為響應(yīng)式執(zhí)行。

? ? ? ? 后續(xù)再進行補充完善。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容