Hystrix 企業(yè)級應(yīng)用避坑指南
1. 前言
各位同學(xué),學(xué)到這里呢,已經(jīng)是 Hystrix 本套課程的最后一篇了,在本節(jié)中,我將結(jié)合我在工作中經(jīng)常遇到的問題,以及在使用 Hystrix 時(shí)經(jīng)常出現(xiàn)的問題,為大家做一個(gè)簡單的避坑指南,各位同學(xué)通過學(xué)習(xí)本節(jié)內(nèi)容,在實(shí)際工作中可能會(huì)少走一些彎路。
本節(jié)主要內(nèi)容:
-
Hystrix 常見坑介紹與解決方法;
-
Hystrix 企業(yè)級應(yīng)用使用技巧。
2. Hystrix 常見坑介紹與解決方法
2.1 關(guān)于參數(shù)配置的坑
我們在 Spring Cloud 中使用 Hystrix 時(shí),一般會(huì)通過 HystrixCommand 注解去配置我們的 Hystrix 的各個(gè)配置參數(shù),這個(gè)坑就出現(xiàn)在我們對線程池隔離所配置時(shí),由于我們把線程池隔離的屬性的值都設(shè)置為了 1 ,導(dǎo)致配置有時(shí)候不會(huì)生效,詳見下方代碼:
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "1"),
@HystrixProperty(name = "maxQueueSize", value = "1"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "1")
}
如果像上述代碼段中那樣進(jìn)行配置,那么 threadPoolProperties 就不會(huì)生效,所以,各位同學(xué)在編碼的時(shí)候,可以適當(dāng)把上述參數(shù)的值設(shè)置的大一些,比如將上述參數(shù)的值都擴(kuò)大 10 倍:
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "10"),
@HystrixProperty(name = "maxQueueSize", value = "10"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "10")
}
設(shè)置成這樣的話,無論怎么測試,threadPoolProterties 都是生效的。
2.2 關(guān)于回調(diào)方法的坑
當(dāng)我們在項(xiàng)目中需要使用 Hystrix 的服務(wù)容錯(cuò)或降級時(shí),我們需要配置 fallbackMethod 屬性,將該屬性的值聲明為我們的備用方法。這個(gè)坑就出現(xiàn)在我們的原方法與備用方法中間,如果我們的原方法中的參數(shù)類型和參數(shù)個(gè)數(shù)與備用方法中的不同,那么當(dāng)發(fā)生服務(wù)容錯(cuò)或降級時(shí),就會(huì)報(bào)下述異常:
fallback method wasn't found
我們來看一下正確的配置原方法與備用方法的代碼:
@RequestMapping("temp.do")
@ResponseBody
@HystrixCommand(fallbackMethod = "temp_failed")
public CommonResponse<String> temp(String msg, int code){
return tempService.temp(msg, code);
}
public CommonResponse<String> temp_failed(String msg, int code){
return CommonResponse.errorResponse("服務(wù)拒絕處理,請聯(lián)系系統(tǒng)管理員");
}
通過上述代碼段,我們可以看到,temp 方法與 temp_failed 方法的參數(shù)類型與參數(shù)個(gè)數(shù)是相同的,這樣我們的服務(wù)容錯(cuò)與降級才能配置生效。
2.3 關(guān)于 Hystrix 調(diào)用無效的坑
當(dāng)我們在項(xiàng)目間互相調(diào)用服務(wù)時(shí),有時(shí)候會(huì)出現(xiàn)請求無法執(zhí)行或請求沒有響應(yīng)的情況,這個(gè)坑是由于 Hystrix 的超時(shí)時(shí)間引起的,如果我們沒有給 Hystrix 配置一個(gè)超時(shí)時(shí)間,那么 Hystrix 默認(rèn)的超時(shí)時(shí)間會(huì)很短,很容易會(huì)造成服務(wù)間互相調(diào)用失敗。
針對于這種情況,我們只需要手動(dòng)的去配置 Hystrix 的超時(shí)時(shí)間,如下代碼所示:
hystrix:
threadpool:
default:
coreSize: 200
maxQueueSize: 200
queueSizeRejectionThreshold: 50
execution:
timeout:
enabled: true
isolation:
strategy: THREAD
semaphore:
maxConcurrentRequests: 1000
thread:
timeoutInMilliseconds: 30000
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 5000
各位同學(xué)只需要知道各種請求超時(shí)參數(shù)如何進(jìn)行配置就行了。
3. Hystrix 企業(yè)級應(yīng)用使用技巧
3.1 關(guān)于微服務(wù)監(jiān)控平臺(tái)
技巧 1
如果我們的微服務(wù)監(jiān)控平臺(tái)沒有任何數(shù)據(jù),或者說,在打開微服務(wù)平臺(tái)之后,各參數(shù)一直處于 loading 狀態(tài),這個(gè)時(shí)候,我們只需要在服務(wù)端調(diào)用任意一個(gè)服務(wù)接口即可,這樣在微服務(wù)監(jiān)控平臺(tái),我們就能看到被監(jiān)控實(shí)例的參數(shù)了。
技巧 2
如果我們在訪問 /actuator/hystrix.stream 路徑時(shí),系統(tǒng)找不到對應(yīng)的路徑,即報(bào) 404 異常,那么我們需要在對應(yīng)項(xiàng)目的啟動(dòng)類中添加一個(gè) Bean :
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registration.addUrlMappings("/hystrix.stream");
return registration;
}
這樣我們就能正常訪問 /actuator/hystrix.stream 下的路徑了。
3.2 關(guān)于 Hystrix 高可用
在真實(shí)項(xiàng)目中,我們的微服務(wù)項(xiàng)目往往都是由 2 個(gè)及以上的服務(wù)模塊所構(gòu)成,這樣一來,如果我們的服務(wù)只有一個(gè) Hystrix 節(jié)點(diǎn),那么在洪峰到來時(shí),很有可能我們的這一個(gè) Hystrix 節(jié)點(diǎn)會(huì)掛掉,所以我們需要在項(xiàng)目中對 Hystrix 配置一個(gè)最少 2 個(gè)節(jié)點(diǎn)的高可用集群。
這里由于篇幅限制,我說一下實(shí)現(xiàn)的思路:
我們保證默認(rèn)的一個(gè) Hystrix 節(jié)點(diǎn)不動(dòng),然后在另一個(gè)服務(wù)中引入 Hystrix 的依賴,即將 Hystrix 引入到另一個(gè)服務(wù)中,然后我們需要將兩個(gè) Hystrix 服務(wù)全部注冊到 Eureka 上,在注冊到 Eureka 上后,我們需要配置默認(rèn)的 Hystrix 節(jié)點(diǎn)與另一個(gè) Hystrix 節(jié)點(diǎn)間的相互引用,即配置兩個(gè)服務(wù)間的相互引用。
在相互引用配置完畢后,我們需要在具體使用 Hystrix 的接口中添加 Hystrix 的注解配置項(xiàng),這樣,我們就實(shí)現(xiàn)了一個(gè)具有 2 個(gè)節(jié)點(diǎn)的 Hystrix 高可用集群。
4. 小結(jié)

本小節(jié)為大家介紹了,Hystrix 這款微服務(wù)治理中間件在企業(yè)級應(yīng)用時(shí),經(jīng)常遇到的一些坑,包括 Hystrix 參數(shù)配置、回調(diào)方法等常見問題,并針對這些問題都給出了相應(yīng)的解決方案。在介紹常見問題的同時(shí),結(jié)合我的實(shí)際工作經(jīng)歷,給大家介紹了 Hystrix 的微服務(wù)監(jiān)控平臺(tái),已經(jīng)高可用實(shí)現(xiàn)方案,希望各位同學(xué)能夠運(yùn)用到真實(shí)項(xiàng)目中去。
本套課程就到這里了,希望同學(xué)們學(xué)的開心,碼的快樂。最后,感謝各位同學(xué)的支持與關(guān)注,江湖路遠(yuǎn),我們有緣再會(huì)!