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

可以看到,請求已經(jīng)正常返回了 helloWorld 。
接下來,讓我們模擬以下請求錯誤的情況,即在請求時,我們認為設置一個延時時間,來讓 Hystrix 捕捉到這一異常,并應用 Hystrix 的容錯機制。
@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";
}
代碼解釋:
第 3 行,我們使用 HystrixCommand 注解的 fallbackMethod 屬性來定義當請求不能正常響應時的應急方案,fallbackMethod 屬性的值就是請求不能正常響應時,所返回的方法,這里的 helloFail 就是方法名。
第 5 行,我們手動加入了一個延時時間,該延時時間可以在響應請求時,延遲一秒響應,這就是我們手動實現(xiàn)的一個服務異常情況,該情況會被 Hystrix 的容錯機制捕捉到。
第 9-11 行,我們編寫代碼,實現(xiàn)了一個當請求 helloWorld 失敗時,所返回的應急方法,該方法返回 helloFailed 字符串。
以上代碼中,我們加入了 Hystrix 的容錯機制,讓我們來看看效果。

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

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