實際業務場景下服務快速失敗實戰
1. 前言
我們知道,服務快速失敗分為普通版本和斷路器版本。在本節中,我將繼續為大家介紹,在真實業務場景下的,服務快速失敗的應用方法及代碼實現。
本節主要內容:
-
服務快速失敗真實業務場景描述;
-
業務場景實現思路分析與實操。
2. 服務快速失敗真實業務場景描述
業務場景描述
我們繼續以某大廠的用戶注冊服務為例,只不過所在的業務場景發生了變化。
有這樣一個真實的業務場景,在用戶請求用戶注冊服務時,該服務要求用戶上傳自己的注冊頭像,在單體項目架構下,我們上傳多次頭像都沒有任何問題,服務可以正常的進行。但是,將我們把項目架構進行演進,項目由單體架構演變為了微服務的分布式架構之后,時不時地會出現因為用戶注冊頭像上傳失敗而導致整個用戶注冊服務無法繼續進行的情況。
問題原因分析
在解決問題之前,我們首先來分析一下這種問題產生的原因。
當項目架構由傳統的單體架構演變為基于微服務的分布式架構之后,我們需要處理很多由于微服務架構所帶來的已知問題,在將這些已知問題處理好后,我們的項目才能正常運行,而上述業務場景中的問題就包括在這些已知問題中,下面我們來介紹一下問題產生的原因(至于其他已知問題,這里不做介紹)。
無論是傳統的用戶注冊服務,還是分布式的用戶注冊服務,其用戶注冊處理邏輯都大同小異。在處理用戶注冊邏輯時,一般會將用戶注冊頭像上傳的業務邏輯與用戶注冊的處理邏輯相分離,即將用戶注冊頭像上傳作為一個單獨的服務存在,同時用戶注冊的處理邏輯也作為一個單獨的服務接口。
當正式調用用戶注冊服務時,會對用戶注冊頭像上傳服務做一個校驗,如果用戶成功上傳了所注冊的頭像,那么用戶注冊頭像上傳服務會返回一個頭像地址,并且在最后的用戶注冊邏輯中,將該地址與當前注冊的用戶相關聯,這就完成了整個用戶注冊的流程。
上述業務場景的問題就出現在用戶注冊頭像上傳服務中,當外界因素或者由于我們處理用戶注冊頭像格式時的處理邏輯不嚴謹時,就會出現用戶注冊頭像上傳失敗的情況, 其中,由處理邏輯不嚴謹所引起的錯誤可以直接通過修改源碼邏輯來規避這種錯誤,但是由外界因素所引起的錯誤就不好規避了。
由外界因素引起的錯誤,可能是項目所在服務器網絡波動的影響,也可能是各微服務所在節點間數據通信丟失或堵塞的影響,也可能是沒有對分布式事務做處理的影響。
我們不需要知道這種錯誤具體是由于什么外界因素所引起的,我們只需要關心,在外界因素對服務造成影響時,我們有兜底的解決方案即可。那么接下來就讓我們來看一下如何設計這個兜底的方案。
3. 業務場景實現思路分析與實操
實現思路分析
鑒于上述業務場景中所描述的問題,我們可以在用戶注冊頭像上傳服務中,添加對服務快速失敗的支持,接下來讓我們來看一下如何操作。
在為用戶注冊頭像上傳服務配置了快速失敗之后,當服務再次受到外界因素影響時,用戶注冊頭像服務會返回一個兜底的地址,并將該地址與當前注冊的用戶相關聯,之后,用戶可以在個人中心修改自己的注冊頭像,直到注冊頭像上傳成功為止。
實操
我們需要先在項目的啟動類上,配置 Hystrix 的斷路器:
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
代碼解釋
第 3 行,我們通過在項目啟動類上添加 EnableCircuitBreaker 注解,來啟動 Hystrix 的斷路器,這是在真實項目中使用快速失敗的前提,如果沒有在項目中打開斷路器,則項目中就不會存在服務快速失敗的概念。
接著,我們來配置用戶注冊頭像上傳服務:
@RequestMapping("upload_user_icon.do")
@ResponseBody
@HystrixCommand(fallbackMethod = "uploadUserIcon_failed")
public CommonResponse<String> uploadUserIcon(@Param("userIcon") MultipartFile file){
return userService.uploadUserIcon(file);
}
public CommonResponse<String> uploadUserIcon_failed(){
// 在用戶注冊頭像上傳失敗后,返回項目臨時頭像地址,并提示用戶
}
代碼解釋
此段代碼和我們上節中的服務容錯與降級的配置相似,唯一不同的是,當用戶注冊頭像上傳服務無法正常處理時,會訪問 uploadUserIcon_failed 方法,且返回一個臨時的頭像地址,并提示用戶注意。
在經過上述配置之后,當用戶注冊頭像上傳服務無法正常處理時,通過返回這個兜底的臨時頭像地址來滿足整體的用戶注冊服務的業務需要,保證了用戶注冊服務的繼續進行。
Tips: 我們在介紹服務快速失敗時,是將普通版本的和斷路器分開進行的介紹,因為是兩個不同的版本,但是在實際項目中,往往會結合這兩個版本共同使用,這樣才能充分發揮服務快速失敗的作用。
4. 小結

本小節以一個真實業務場景下的服務,為大家介紹了如何在真實業務場景下配置 Hystrix 的服務快速失敗,并且做了代碼實操,針對容易出現問題的地方,也做了注意事項的補充,希望同學們可以對真實業務場景下,服務快速失敗的應用方法有所了解。