實(shí)際業(yè)務(wù)場(chǎng)景下服務(wù)容錯(cuò)與服務(wù)降級(jí)實(shí)戰(zhàn)
1. 前言
在上一章中,我們對(duì) Hystrix 中的所有的微服務(wù)治理特性都做了學(xué)習(xí)和了解,同時(shí)我也通過 demo 樣例的形式,來對(duì)每一個(gè)特性都做了代碼實(shí)現(xiàn),可是這些代碼并不是我們真實(shí)業(yè)務(wù)場(chǎng)景下的代碼,只能用來學(xué)習(xí)特性所用。
為了將我們所學(xué)習(xí)和了解到的微服務(wù)治理特性應(yīng)用于真實(shí)項(xiàng)目中,于是規(guī)劃了 4 節(jié)在實(shí)際業(yè)務(wù)場(chǎng)景下 Hystrix 微服務(wù)治理特性的應(yīng)用內(nèi)容,希望可以通過這 4 節(jié)的介紹,大家可以了解到如何在實(shí)際項(xiàng)目中去應(yīng)用這些特性。
在本節(jié)中,我將為大家介紹真實(shí)業(yè)務(wù)場(chǎng)景下,服務(wù)容錯(cuò)與降級(jí)的應(yīng)用方法,及代碼實(shí)現(xiàn)。
本節(jié)主要內(nèi)容:
-
服務(wù)容錯(cuò)與降級(jí)真實(shí)業(yè)務(wù)場(chǎng)景描述;
-
業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)思路分析與實(shí)操。
2. 服務(wù)容錯(cuò)與降級(jí)真實(shí)業(yè)務(wù)場(chǎng)景描述
業(yè)務(wù)場(chǎng)景描述
有這樣一個(gè)真實(shí)的業(yè)務(wù)場(chǎng)景:在某大廠的用戶業(yè)務(wù)模塊下,存在一個(gè)用戶注冊(cè)服務(wù)接口,在正常流量下,請(qǐng)求該用戶注冊(cè)服務(wù)接口,不會(huì)出現(xiàn)任何問題,業(yè)務(wù)可以正常開展。但是,在遇到某活動(dòng)舉辦時(shí),當(dāng)再次請(qǐng)求該用戶注冊(cè)服務(wù)接口時(shí),該服務(wù)接口就會(huì)報(bào)服務(wù)處理異常,我們需要做的就是用服務(wù)容錯(cuò)與降級(jí)的概念來解決這種異?,F(xiàn)象。
問題原因分析
在解決問題之前,我們首先來分析一下這種問題產(chǎn)生的原因。
在遇到某活動(dòng)舉辦時(shí),當(dāng)再次請(qǐng)求該用戶注冊(cè)服務(wù)接口時(shí),由于此時(shí)的請(qǐng)求流量較正常情況下的多,即此時(shí)的請(qǐng)求流量可能是正常情況下請(qǐng)求流量的幾倍,甚至更多,我們的服務(wù)在處理請(qǐng)求時(shí),一方面出現(xiàn)了服務(wù)處理堆積的現(xiàn)象;另一方面,當(dāng)我們的服務(wù)器或數(shù)據(jù)庫不能繼續(xù)處理更多的請(qǐng)求時(shí),沒有給用戶一個(gè)合理地提示,直接讓程序報(bào)出了異常。
以上兩方面就是產(chǎn)生該異常的原因,第一方面我們使用服務(wù)容錯(cuò)與降級(jí)無法解決,只能使用高并發(fā)相關(guān)的知識(shí),通過限流來解決,但是第二方面我們可以使用服務(wù)容錯(cuò)與降級(jí)的概念來解決,接下來就讓我們看一下如何解決吧。
3. 業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)思路分析與實(shí)操
實(shí)現(xiàn)思路分析
鑒于上述業(yè)務(wù)場(chǎng)景中所描述的問題,我們可以在該用戶注冊(cè)服務(wù)上,通過添加 Hystrix 的服務(wù)容錯(cuò)與降級(jí)的注解,再結(jié)合相關(guān)配置項(xiàng)來實(shí)現(xiàn)該用戶注冊(cè)服務(wù)的容錯(cuò)與降級(jí)。
在為該用戶注冊(cè)服務(wù)配置了容錯(cuò)與降級(jí)之后,當(dāng)在大流量情況下,如果我們的服務(wù)器或數(shù)據(jù)庫不能繼續(xù)處理更多的請(qǐng)求時(shí),此時(shí)會(huì)給用戶一個(gè)提示,并且拒絕處理后續(xù)的服務(wù)請(qǐng)求。
由于我們的本套課程不涉及 Open Feign ,所以這里為大家介紹以注解形式配置服務(wù)容錯(cuò)與降級(jí)。
實(shí)操
@RequestMapping("register.do")
@ResponseBody
@HystrixCommand(fallbackMethod = "register_failed")
public CommonResponse<String> register(@RequestBody User user){
return userService.register(user);
}
public CommonResponse<String> register_failed(){
return CommonResponse.errorResponse("服務(wù)拒絕處理,請(qǐng)聯(lián)系系統(tǒng)管理員");
}
代碼解釋
第 3 行,我們使用 HystrixCommand 注解的 fallbackMethod 屬性,來為用戶注冊(cè)服務(wù)添加容錯(cuò)與降級(jí),此時(shí),當(dāng)該服務(wù)出現(xiàn)上述業(yè)務(wù)場(chǎng)景問題時(shí),就會(huì)返回 register_failed 方法所對(duì)應(yīng)的響應(yīng),并且后續(xù)服務(wù)不會(huì)繼續(xù)處理。
Tips:
1. 配置服務(wù)容錯(cuò)與降級(jí)時(shí),首先需要清楚對(duì)應(yīng)服務(wù)下都可能會(huì)出現(xiàn)哪些問題,出現(xiàn)這些問題的產(chǎn)生原因主要是什么,我們只有在清楚了這些錯(cuò)誤產(chǎn)生的原因之后,我們才能合理地去編寫服務(wù)容錯(cuò)與降級(jí)時(shí)的響應(yīng)結(jié)果,這點(diǎn)同學(xué)們需要注意。
2. 在實(shí)際項(xiàng)目開發(fā)中,基本上每個(gè)承載大流量的接口服務(wù)都會(huì)配置服務(wù)容錯(cuò)與降級(jí),這種配置方式可能在微服務(wù)項(xiàng)目中已經(jīng)成為了一種習(xí)慣。
4. 小結(jié)

本小節(jié)以一個(gè)真實(shí)業(yè)務(wù)場(chǎng)景下的服務(wù),為大家介紹了如何在真實(shí)業(yè)務(wù)場(chǎng)景下配置 Hystrix 的服務(wù)容錯(cuò)與降級(jí),并且做了代碼實(shí)操,針對(duì)容易出現(xiàn)問題的地方,也做了注意事項(xiàng)的補(bǔ)充,希望同學(xué)們可以對(duì)真實(shí)業(yè)務(wù)場(chǎng)景,服務(wù)容錯(cuò)與降級(jí)的應(yīng)用方法有所了解。