問題概述
在微服務架構中一定要預防微服務雪崩問題,微服務雪崩問題就是指在微服務架構中,當一個服務出現故障時,由于服務之間的依賴關系,故障可能會傳播到其他服務,從而導致了大規模的服務失敗,系統無法正常運行。這種情況就像雪崩一樣,因為最初的一個小問題最終引發了整個系統的崩潰。
簡單來說,微服務雪崩就是微服務之間相互調用,因為調用鏈中的一個服務故障,引起整個鏈路都無法訪問的情況
熔斷:當某個異常條件被觸發,直接熔斷整個服務,而不是一直等到此服務超時,為了防止防止整個系統的故障,而采用了一些保護措施(過載保護)。比如A服務的X功能依賴B服務的某個接口,當B服務接口響應很慢時,A服務X功能的響應也會被拖慢,進一步導致了A服務的線程都卡在了X功能上,A服務的其它功能也會卡主或拖慢。此時就需要熔斷機制,即A服務不在請求B這個接口,而可以直接進行降級處理。
降級: 服務器壓力劇增時,根據當前業務情況以及流量,對一些服務和頁面進行有策略的降級。以此緩解服務器資源的壓力,以保證核心業務的正常運行,同時也保證了客戶和大部分客戶得到正確的響應
解決方案
常用的預防微服務雪崩的方法有:
超時處理:設定超時時間,請求超過一定時間沒有響應就返回錯誤信息,不會無休止的等待
熔斷降級:當服務的異常數或異常比例超過了預設的閾值,熔斷器就會進入開啟狀態,暫時中斷對該服務的請求,此時走降級方法,能夠快速響應,確保系統的基本功能能夠繼續運行
限流:限制對服務的請求速率,避免短時間內大量的請求導致系統崩潰
線程池隔離:給要請求的資源分配一個線程池,線程池去控制請求數量
信號量隔離:使用計數器模式,記錄請求資源的并發線程數量,達到信號量上限時,禁止新的請求(信號隔離適合同步請求,控制并發數,比如對文件的下載并發數進行控制)
大多場景都適合使用線程池隔離,對于需要同步操作控制并發數的場景可以使用信號量隔離
Sentinel解決熔斷降級
什么是Sentinel:Sentinel (分布式系統的流量防衛兵) 是阿?開源的?套?于服務容錯的綜合性解決?案。它以流量為切?點, 從流量控制、熔斷降級、系統負載保護等多個維度來保護服務的穩定性
本項目中,使用Sentinel實現限流、熔斷等機制預防微服務雪崩
熔斷降級是微服務保護的一種方法,當使用Feign進行遠程調用,在客戶端通過熔斷降級措施進行微服務保護
如:orders-manager訂單服務請求customer查詢地址簿,在進行feign遠程調用過程時出現異常將走降級方法,當異常比例或異常數達到一定的閾值將出發熔斷,熔斷期間將直接走降級邏輯快速響應
在feign進行遠程調用服務的同時,Sentinel會一直對使用@SentinelResource注解標注的資源進行流量控制和熔斷降級(SentinelResource注解的屬性:value--用于定義資源的名稱,Sentinel對其進行流量控制和熔斷降級,fallback:降級方法,但是異常不是因為限流和熔斷等,blockHandler:出發限流、熔斷時執行的降級方法)
實例:
@Component
@Slf4j
public class CustomerClient {@Resourceprivate AddressBookApi addressBookApi;@SentinelResource(value = "getAddressBookDetail", fallback = "detailFallback", blockHandler = "detailBlockHandler")public AddressBookResDTO getDetail(Long id) {log.error("根據id查詢地址簿,id:{}", id);// 調用其他微服務方法AddressBookResDTO detail = addressBookApi.detail(id);return detail;}//執行異常走public AddressBookResDTO detailFallback(Long id, Throwable throwable) {log.error("非限流、熔斷等導致的異常執行的降級方法,id:{},throwable:", id, throwable);return null;}//熔斷后的降級邏輯public AddressBookResDTO detailBlockHandler(Long id, BlockException blockException) {log.error("觸發限流、熔斷時執行的降級方法,id:{},blockException:", id, blockException);return null;}
}
當customer服務恢復之后,熔斷時間結束此時會再次嘗試請求customer,如果成功請求將關閉熔斷,恢復原來的鏈路,否則將再次走降級邏輯
關于Sentinel實現熔斷降級還可以看:服務熔斷降級 Sentinel(保姆級)_sentinel 熔斷降級-CSDN博客
熔斷降級貌似還有Hystrix可以實現,之后可以再去了解