Hystrix 配置項(xiàng)講解(一)
1. 前言
Hystrix 作為一款微服務(wù)監(jiān)控與治理工具,針對(duì)與微服務(wù)復(fù)雜性的特點(diǎn),其提供了很多與微服務(wù)監(jiān)控和治理相關(guān)的配置項(xiàng)。通過(guò)在項(xiàng)目中配置這些配置項(xiàng),可以很好地管理我們的微服務(wù)項(xiàng)目,對(duì)微服務(wù)的監(jiān)控與治理都能起到一定的積極作用。
鑒于 Hystrix 配置項(xiàng)繁多的特點(diǎn),所以我將 Hystrix 配置項(xiàng)的講解分為了兩個(gè)小節(jié),分別是:基礎(chǔ)配置項(xiàng)講解、其他配置項(xiàng)講解。本文會(huì)首先基于 Hystrix 的基礎(chǔ)配置項(xiàng)進(jìn)行詳細(xì)地介紹。
本節(jié)主要內(nèi)容:
-
Hystrix 配置項(xiàng)概覽;
-
Hystrix 常用配置項(xiàng)注解詳解。
希望同學(xué)們可以完全掌握本節(jié)內(nèi)容。
2. Hystrix 配置項(xiàng)概覽
Hystrix 的配置項(xiàng)分為,Hystrix 原生官網(wǎng)配置、整合 Spring Cloud 注解配置,這兩種情況。前者適合學(xué)習(xí)原生 Hystrix 應(yīng)用方法,但該類(lèi)型配置項(xiàng)繁多,分不清主次,所以不適合新手學(xué)習(xí);后者適合學(xué)習(xí) Hystrix 與實(shí)際業(yè)務(wù)場(chǎng)景的應(yīng)用,由于 Spring Cloud 對(duì) Hystrix 的配置項(xiàng)進(jìn)行了過(guò)濾,所以,新手學(xué)起來(lái)更簡(jiǎn)單。
鑒于此,本節(jié)會(huì)介紹整合了 Spring Cloud 框架的 Hystrix 各個(gè)配置項(xiàng)的基本定義,以及各個(gè)配置項(xiàng)的基本使用,初學(xué)者在學(xué)完本節(jié)內(nèi)容之后,可以基本的來(lái)配置 Hystrix 。
接下來(lái)就讓我們來(lái)看看都有哪些基礎(chǔ)配置吧。
3. Hystrix 常用配置項(xiàng)注解詳解
Hystrix 常用基礎(chǔ)配置項(xiàng)注解如下表所示:
注解名稱(chēng) | 適用位置 | 作用 |
---|---|---|
@EnableHystrix | 類(lèi) | 通知應(yīng)用使用 Hystrix 熔斷器 |
@EnableHystrixDashboard | 類(lèi) | 通知應(yīng)用使用 Hystrix 服務(wù)監(jiān)控臺(tái) |
@HystrixCommand | 方法 | 設(shè)置方法的服務(wù)容錯(cuò)機(jī)制 |
@HystrixProperty | 方法 | 設(shè)置 Hystrix 中的參數(shù) |
@HystrixCollapser | 方法 | 合并請(qǐng)求 |
3.1 EnableHystrix 注解詳解
@EnableHystrix 注解是在 Spring Cloud 框架中使用 Hystrix 的基礎(chǔ)必須注解,即如果想要在 Spring Cloud 框架中使用 Hystrix ,就必須要先聲明 @EnableHystrix 注解,來(lái)告訴 Spring Cloud 框架,你要在其中使用 Hystrix 了。
EnableHystrix 注解是作用在類(lèi)上的注解,該注解沒(méi)有任何參數(shù),可以理解為,只是一個(gè)在 Spring Cloud 框架中來(lái)開(kāi)啟或關(guān)閉 Hystrix 的開(kāi)關(guān),具體用法我們看以下代碼。
@EnableHystrix
public class DemoApplication {
// 現(xiàn)在,同學(xué)們不需要理解main方法,重點(diǎn)看所使用的注解即可
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
代碼解釋?zhuān)?/strong>
第 1 行,我們將 @EnableHystrix 注解放到了 Spring Boot 項(xiàng)目的啟動(dòng)類(lèi)上,這就表示,我們開(kāi)啟了 Hystrix ,即我們可以在項(xiàng)目中使用 Hystrix 了。
Tips: 在 Spring Boot 項(xiàng)目中,如果想使用 Hystrix ,就一定先要在項(xiàng)目的啟動(dòng)類(lèi)上,添加上述注解,否則,即使將 Hystrix 的依賴(lài)引入到了項(xiàng)目中,也無(wú)法使用 Hystrix 及任何功能特性。
3.2 EnableHystrixDashboard 注解詳解
@EnableHystrixDashboard 注解和 @EnableHystrix 注解的作用類(lèi)似,即也可以理解為它是一個(gè)開(kāi)關(guān),用來(lái)控制在項(xiàng)目中是否使用 HstrixDasboard 服務(wù)監(jiān)控臺(tái),如果聲明了該注解,則表示使用 HstrixDasboard 服務(wù)監(jiān)控臺(tái),否則,就不使用 HstrixDasboard 服務(wù)監(jiān)控臺(tái)。
@EnableHystrixDashboard 注解同樣是作用在類(lèi)上的注解,和 @EnableHystrix 注解不同的地方在于,該注解不是使用 Hystrix 所必須聲明的注解,即在項(xiàng)目中你可以只使用 Hystrix 的功能特性,不使用它的 DashBoard 服務(wù)監(jiān)控臺(tái),使用方法如下代碼所示。
@EnableHystrixDashboard
public class DemoApplication {
// 現(xiàn)在,同學(xué)們不需要理解main方法,重點(diǎn)看所使用的注解即可
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Tips:
1. Hystrix Dashboard 服務(wù)監(jiān)控臺(tái)是否需要使用,一般是跟隨項(xiàng)目要求來(lái)的,一般而言,任何一個(gè)項(xiàng)目都需要使用,因?yàn)椴还苁情_(kāi)發(fā)者,還是運(yùn)維者,都需要在后臺(tái)對(duì)服務(wù)進(jìn)行監(jiān)控;
2. Hystrix Dashboard 自帶了很多我們需要用到的屬性,通過(guò)查看這些屬性,我們可以很清楚地了解每一個(gè)服務(wù)的健康情況,該服務(wù)監(jiān)控臺(tái)的使用會(huì)在后期有專(zhuān)門(mén)小節(jié)進(jìn)行介紹,希望同學(xué)們可以持續(xù)關(guān)注。
3.3 HystrixCommand 注解詳解
@HystrixCommand 注解,是 Hystrix 注解中的核心注解,可以說(shuō),只要想使用 Hystrix 的功能特性,就必須要使用該注解。
@HystrixCommand 注解提供了豐富的屬性,來(lái)讓我們配置 Hystrix 的功能特性,我將經(jīng)常用到的屬性匯總成了一個(gè)表格,如下表所示:
我們?cè)诹私饬诉@些屬性之后,就可以使用 HystrixCommand 屬性來(lái)配置 Hystrix 的功能特性了。
屬性名稱(chēng) | 屬性類(lèi)型 | 默認(rèn)值 | 作用 |
---|---|---|---|
fallbackMethod | String | 空字符串 | 配置服務(wù)容錯(cuò)機(jī)制 |
defaultFallback | String | 空字符串 | 配置默認(rèn)服務(wù)容錯(cuò)機(jī)制 |
threadPoolKey | String | 空字符串 | 配置線程池隔離策略 |
threadPoolProperties | HystrixProperty[] | 空數(shù)組 | 配置線程池詳細(xì)策略 |
接下來(lái),我們來(lái)看看這幾個(gè)屬性的詳細(xì)信息
fallbackMethod 屬性
該屬性的作用就是配置項(xiàng)目中,服務(wù)的容錯(cuò)機(jī)制(什么是容錯(cuò)機(jī)制已在前面文章中有所介紹,這里不再贅述),我們直接看用法。
這里以一個(gè)簡(jiǎn)單的 helloWorld 請(qǐng)求為例,我們先來(lái)看正常請(qǐng)求。
@RequestMapping(value = "hello", method = RequestMethod.GET)
@ResponseBody
public String hello() {
return "helloWorld";
}
代碼解釋?zhuān)?/strong>
第 1-2 行,我們使用 SpringBoot 中的注解,將請(qǐng)求暴露出去,即添加 helloWorld 請(qǐng)求的路徑。
第 3-5 行,我們編寫(xiě)代碼,實(shí)現(xiàn) helloWorld 請(qǐng)求,其請(qǐng)求的響應(yīng)結(jié)果是返回 helloWorld 字符串。
以上代碼中,我們沒(méi)有添加任何 Hystrix 的注解,只是一個(gè)很普通的正常請(qǐng)求,我們先來(lái)看下返回結(jié)結(jié)果。

可以看到,請(qǐng)求已經(jīng)正常返回了 helloWorld 。
接下來(lái),讓我們模擬以下請(qǐng)求錯(cuò)誤的情況,即在請(qǐng)求時(shí),我們認(rèn)為設(shè)置一個(gè)延時(shí)時(shí)間,來(lái)讓 Hystrix 捕捉到這一異常,并應(yīng)用 Hystrix 的容錯(cuò)機(jī)制。
@RequestMapping(value = "hello", method = RequestMethod.GET)
@ResponseBody
@HystrixCommand(fallbackMethod = "helloFail")
public String hello() throws InterruptedException {
Thread.sleep(1000);
return "helloWorld";
}
public String helloFail(){
return "helloFailed";
}
代碼解釋?zhuān)?/strong>
第 3 行,我們使用 HystrixCommand 注解的 fallbackMethod 屬性來(lái)定義當(dāng)請(qǐng)求不能正常響應(yīng)時(shí)的應(yīng)急方案,fallbackMethod 屬性的值就是請(qǐng)求不能正常響應(yīng)時(shí),所返回的方法,這里的 helloFail 就是方法名。
第 5 行,我們手動(dòng)加入了一個(gè)延時(shí)時(shí)間,該延時(shí)時(shí)間可以在響應(yīng)請(qǐng)求時(shí),延遲一秒響應(yīng),這就是我們手動(dòng)實(shí)現(xiàn)的一個(gè)服務(wù)異常情況,該情況會(huì)被 Hystrix 的容錯(cuò)機(jī)制捕捉到。
第 9-11 行,我們編寫(xiě)代碼,實(shí)現(xiàn)了一個(gè)當(dāng)請(qǐng)求 helloWorld 失敗時(shí),所返回的應(yīng)急方法,該方法返回 helloFailed 字符串。
以上代碼中,我們加入了 Hystrix 的容錯(cuò)機(jī)制,讓我們來(lái)看看效果。

從上圖中我們可以看到,我們還是請(qǐng)求的 helloWorld 請(qǐng)求,但是返回的確是 helloFailed ,這就表明,我們通過(guò) HystrixCommand 注解的 fallbackMethod 屬性來(lái)配置的服務(wù)容錯(cuò)起作用了。
defaultFallback 屬性
defaultFallback 屬性和 fallbackMethod 屬性所實(shí)現(xiàn)的功能是基本相同的,只不過(guò) defaultFallback 屬性是用來(lái)配置默認(rèn)的應(yīng)急方法,即當(dāng)我們的項(xiàng)目中存在多個(gè)應(yīng)急方法時(shí),我們給其中一個(gè)請(qǐng)求所配置的默認(rèn)應(yīng)急方法。
defaultFallback 屬性所實(shí)現(xiàn)的效果和 fallbackMethod 屬性是相同的,這里不再贅述。
threadPoolKey 和 threadPoolProperties屬性
threadPoolKey 屬性是用來(lái)配置線程池隔離策略的屬性。
threadPoolProperties 屬性,則是用來(lái)配置線程池詳細(xì)策略的屬性,例如,核心線程數(shù)量、最大線程數(shù)量等。
@RequestMapping(value = "hello", method = RequestMethod.GET)
@ResponseBody
@HystrixCommand(fallbackMethod = "helloFail", threadPoolKey = "HelloHystrix")
public String hello() throws InterruptedException {
Thread.sleep(1000);
return "helloWorld";
}
public String helloFail(){
return "helloFailed";
}
第 3 行,我們使用 HystrixCommand 的 threadPoolKey 屬性來(lái)配置線程池隔離,即我們將 helloWorld 請(qǐng)求劃到了名為 HelloHystrix 的線程池下,這樣就和主線程分離開(kāi)了。
我們來(lái)看一下 threadPoolProperties 屬性的具體用法。
@RequestMapping(value = "hello", method = RequestMethod.GET)
@ResponseBody
@HystrixCommand(fallbackMethod = "helloFail", threadPoolProperties = {
@HystrixProperty(name = "coresize", value = "2"),
@HystrixProperty(name = "allowMaximumSizeToDivergeFromCoreSize", value = "true"),
@HystrixProperty(name = "maximumSize", value = "2")
})
public String hello() throws InterruptedException {
Thread.sleep(1000);
return "helloWorld";
}
public String helloFail(){
return "helloFailed";
}
代碼解釋?zhuān)?/strong>
第 4 行,我們?yōu)?threadPoolProperties 定義了幾個(gè)常用的線程池隔離策略,它們分別是:核心線程數(shù)、開(kāi)啟最大線程數(shù)、最大線程數(shù)。至于還有哪些其他的配置項(xiàng),由于不再本套課程內(nèi),同學(xué)們可以自行查閱資料了解。
Tips:
1. 在實(shí)際工作中,defaultFallback 屬性相對(duì)而言很少會(huì)用到,一般會(huì)手動(dòng)使用 fallbackMethod 屬性來(lái)直接指定相關(guān)請(qǐng)求所對(duì)應(yīng)的應(yīng)急方法;
2. threadPoolProperties 屬性經(jīng)常使用,這里只是將最經(jīng)常使用的幾個(gè)配置策略給同學(xué)們做了介紹,剩下不常用的希望同學(xué)們可以自行查閱了解;
3. 在使用 threadPoolProperties 屬性時(shí),如果我們的核心線程數(shù)量和最大線程數(shù)量相等,此時(shí)又有超過(guò)該數(shù)量的請(qǐng)求來(lái)請(qǐng)求服務(wù)了,那么,在這種情況下,請(qǐng)一定要配置 Hystrix 的降級(jí)策略,否則,后臺(tái)服務(wù)會(huì)直接報(bào)錯(cuò)。
3.4 HystrixProperty 注解詳解
@HystrixProperty 注解其實(shí)是一個(gè)輔助配置注解,他的主要作用就是對(duì)參數(shù)配置場(chǎng)景下,對(duì)每個(gè)配置策略進(jìn)行單獨(dú)的聲明,他的用法就是上述 threadPoolProperties 屬性所配置的那樣。
@HystrixProperty 注解只有兩個(gè)屬性,分別是 name 和 value ,name 的值是 Hystrix 官網(wǎng)定義好的配置項(xiàng)的 key ,而 value 值則是配置對(duì)應(yīng)的具體參數(shù)值。
@HystrixProperty 注解中 name 屬性的描述不能隨意描述,要根據(jù)官網(wǎng)所定義的配置項(xiàng)來(lái)描述,不可無(wú)中生有。
3.5 HystrixCollapser 注解詳解
@HystrixCollapser 注解在 Spring Cloud 中,發(fā)揮著重要的作用。我們可以把他簡(jiǎn)單理解為:它是可以進(jìn)行請(qǐng)求合并的注解,什么是請(qǐng)求合并呢?
正常情況下,我們的每一個(gè)請(qǐng)求都會(huì)請(qǐng)求到我們的服務(wù)中,且最后服務(wù)會(huì)返回給我們對(duì)應(yīng)的響應(yīng)結(jié)果,如果我們存在多個(gè)請(qǐng)求,且每個(gè)請(qǐng)求都是一樣的,在這種情況,我們的服務(wù)也是一個(gè)請(qǐng)求一個(gè)請(qǐng)求的去處理,很是浪費(fèi)資源。
針對(duì)于上述這種再正常不過(guò)的情況,Hystrix 對(duì)此做了很好地優(yōu)化。當(dāng)有多個(gè)相同的請(qǐng)求來(lái)請(qǐng)求我們的服務(wù)時(shí),Hystrix 會(huì)將這些請(qǐng)求進(jìn)行合并,并最終實(shí)現(xiàn)多個(gè)相同請(qǐng)求請(qǐng)求服務(wù),服務(wù)只接收一次請(qǐng)求的目的,這就是請(qǐng)求合并。
請(qǐng)求合并相對(duì)于傳統(tǒng)請(qǐng)求處理而言,大大節(jié)省了服務(wù)器的資源消耗,降低了服務(wù)器的使用和維護(hù)成本。在微服務(wù)項(xiàng)目中,使用請(qǐng)求合并功能,已經(jīng)成了業(yè)界主流的方案。
接下來(lái),先讓我們看一下,HystrixCollapser 注解中都有哪些屬性。
collapserKey 屬性,即請(qǐng)求合并時(shí)的 key ,字符串類(lèi)型,默認(rèn)是 HystrixCollapser 注解所應(yīng)用的方法名。
batchMethod 屬性,需要使用請(qǐng)求合并功能的方法,字符串類(lèi)型,值是需要使用請(qǐng)求合并功能的方法名。
scope 屬性,即請(qǐng)求合并的作用范圍,Scope 類(lèi)型,默認(rèn)只作用在當(dāng)前請(qǐng)求下,可以設(shè)置成全局響應(yīng)。
collapserProperties 屬性,即請(qǐng)求合并的詳細(xì)配置策略,HystrixProperty 數(shù)組類(lèi)型,其內(nèi)容為 Hystrix 官網(wǎng)所規(guī)定內(nèi)容,使用方法同上 HystrixProperty 注解使用方法。
最后,我們使用官網(wǎng)的一個(gè)例子,來(lái)介紹一下 HystrixCollapser 注解如何使用。
@HystrixCollapser(batchMethod = "getUserByIds")
public List<User> getUserById(String id) {
return null;
}
@HystrixCommand(fallbackMethod = "getUserByIdsFail")
public List<List<User>> getUserByIds(List<String> ids) {
List<List<User>> users = new ArrayList<User>();
for (String id : ids) {
users.add(new User(id, "name: " + id));
}
return users;
}
代碼解釋?zhuān)?/strong>
第 1 行,我們使用 HystrixCollapser 注解的 batchMethod 屬性,來(lái)指定需要使用請(qǐng)求合并的方法。
第 6 行,我們使用 HystrixCommand 注解的 fallbackMethod 屬性,來(lái)指定 getUserByIds 方法請(qǐng)求失敗時(shí)所返回的應(yīng)急方法。
Tips:
1. 使用 HystrixCollapser 注解時(shí),其注解作用的方法的返回類(lèi)型,必須是 list 類(lèi)型,這是 Hystrix 的規(guī)定,所以,上述代碼中 getUserById 的方法的返回值是一個(gè) User 類(lèi)型的 list ;
2. 使用 HystrixCollapser 注解時(shí),必須要搭配 HystrixCommand 注解,來(lái)配置對(duì)應(yīng)請(qǐng)求的應(yīng)急方法,這也是 Hystrix 所規(guī)定的,所以,上述代碼中我們?cè)?getUserByIds 方法上定義了應(yīng)急方法;
3. HystrixCollapser 注解在實(shí)際工作中經(jīng)常使用,是提升項(xiàng)目吞吐量最簡(jiǎn)單、最直接的配置。
4. 小結(jié)

本小節(jié)通過(guò)圖文并茂的方式,為大家介紹了 Hystrix 整合 Spring Cloud 后的基礎(chǔ)常用配置項(xiàng),基本上,在 Spring Cloud 框架中的體現(xiàn)方式均已注解方式進(jìn)行體現(xiàn)。針對(duì)在配置過(guò)程中,可能會(huì)遇到的坑,做了專(zhuān)門(mén)的提示;針對(duì)在實(shí)際工作中經(jīng)常使用的注解,做了重點(diǎn)講解和應(yīng)用剖析,旨在幫助同學(xué)們能夠系統(tǒng)性的應(yīng)用這些基礎(chǔ)注解,打好 Hystrix 的配置基礎(chǔ)。