實際業(yè)務(wù)場景下 Hystrix 服務(wù)監(jiān)控實戰(zhàn)
1. 前言
在之前的小節(jié)中,我們已經(jīng)對 Hystrix 提供的微服務(wù)監(jiān)控平臺做了詳細(xì)的介紹,基本上已經(jīng)把這個微服務(wù)監(jiān)控平臺的常用內(nèi)容都介紹完畢了,那么在本節(jié)中,將會結(jié)合這些基本參數(shù)對我們的微服務(wù)進(jìn)行一個監(jiān)控和配置。
本節(jié)主要內(nèi)容:
-
實際業(yè)務(wù)場景描述;
-
業(yè)務(wù)場景實現(xiàn)思路分析與實操。
2. 實際業(yè)務(wù)場景描述
業(yè)務(wù)場景描述
有這樣一個真實的業(yè)務(wù)場景:在某大廠某銷售業(yè)務(wù)項目中,由于某大廠銷售業(yè)務(wù)板塊業(yè)務(wù)的持續(xù)增加,導(dǎo)致之前原本設(shè)計好的項目架構(gòu)出現(xiàn)了問題,不足以支撐持續(xù)增長的業(yè)務(wù)需要,于是,某大廠程序員對項目架構(gòu)做了拆分,并最終形成了以 Spring Cloud 為基礎(chǔ)架構(gòu)的微服務(wù)分布式項目架構(gòu)。
在拆分了項目架構(gòu)之后,雖然可以支撐持續(xù)增長的業(yè)務(wù)需要,但是,在拆分后的項目架構(gòu)中,Hystrix 無法對所有項目進(jìn)行監(jiān)控,即 Hystrix 服務(wù)監(jiān)控平臺只能監(jiān)控一個分散的項目,無法對項目整體進(jìn)行監(jiān)控。
問題原因分析
在解決問題之前,我們首先來分析一下這種問題產(chǎn)生的原因。
上述場景場景中,項目的架構(gòu)方式是微服務(wù)的分布式架構(gòu),而一般來說的 Hystrix 微服務(wù)監(jiān)控平臺默認(rèn)只對一個項目實例起作用,所以,也就導(dǎo)致了一個微服務(wù)平臺只對一個微服務(wù)實例起作用。
3. 業(yè)務(wù)場景實現(xiàn)思路分析與實操
實現(xiàn)思路分析
針對上述場景,我們需要將所有拆分出來的微服務(wù)都要集成到 Hystrix 的微服務(wù)監(jiān)控平臺中去,但是我們應(yīng)該怎么集成呢?
Hystrix 針對不同場景下,提供了不同的微服務(wù)監(jiān)控方式:針對單體架構(gòu)或只需要對一個服務(wù)實例進(jìn)行監(jiān)控的業(yè)務(wù)場景,我們只需要像我在介紹微服務(wù)監(jiān)控平臺時那樣,進(jìn)行配置即可;針對分布式的項目結(jié)構(gòu),或同時需要監(jiān)控多個微服務(wù)的場景,Hystrix 提供了一個名為 Turbine 的多服務(wù)器微服務(wù)監(jiān)控組件。
我們只需要將 Turbine 引入到我們的項目中去,即可實現(xiàn)分布式架構(gòu)下的多微服務(wù)監(jiān)控了。
實操
要想在項目中引入 Turbine ,我們首先需要將 Turbine 的依賴引入到項目中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
在引入了 Turbine 依賴之后,我們需要對 Turbine 進(jìn)行一些簡單的配置,在 yml 配置文件中:
turbine:
aggregator:
clusterConfig: default
appConfig: service-one,service-two,service-three
clusterNameExpression: "'default'"
代碼解釋
第 3 行,我們通過 clusterConfig 屬性來配置 turbine 采用的集群策略,一般我們配置 default 即可。
第 4 行,我們通過 appConfig 屬性來配置需要繼承到 turbine 中的微服務(wù),即需要同時刻進(jìn)行監(jiān)控的微服務(wù),多個微服務(wù)使用英文狀態(tài)下的逗號隔開。
第 5 行,我們通過 clusterNameExpression 屬性來配置集群的名稱表達(dá)式,一般也是采用 default 配置即可。
yml 配置文件配置完成后,我們需要在項目的啟動類中添加 turbine 的注解:
@SpringBootApplication
@EnableHystrix
@EnableHystrixDashboard
@EnableTurbine
public class SaleApplication {
public static void main(String[] args) {
SpringApplication.run(SaleApplication.class, args);
}
代碼解釋
第 4 行,我們添加了 @EnableTurbine 注解,來在項目中開啟 turbine 服務(wù),以支持同時監(jiān)控多個微服務(wù)。
在配置完了上述兩部分后,我們的 Hystrix Turbine 組件就引入到了我們的項目中,我們就可以對多個微服務(wù)進(jìn)行監(jiān)控了。
配置完成后,運行我們的項目,在瀏覽器地址欄中輸入我們的監(jiān)控地址:
http://localhost:port/turbine.stream
我們即可在瀏覽器中看到多個微服務(wù)已經(jīng)被監(jiān)控了,如下圖所示:

從上圖可知,這里我們對兩個微服務(wù)進(jìn)行了監(jiān)控,其圖中的各項監(jiān)控參數(shù)和我們在之前介紹 Hystrix 微服務(wù)監(jiān)控平臺中的參數(shù)一樣,這里就不再贅述了。
Tips:
1. 在 appConfig 屬性配置中,屬性的值為每個需要監(jiān)控的微服務(wù)的 serviceId 名稱,同學(xué)們不要配置錯了。
2. 各位在引入 Turbine 的依賴時,注意不要引錯依賴了,如果大家引入了 aitifactId 為 spring-cloud-starter-turbine 的依賴,我們是無法使用 Turbine 的,因為這個依賴并不是 Spring Cloud 微服務(wù)組件中所提供的 Turbine 服務(wù),而是單獨的 Turbine 服務(wù),我們無法在微服務(wù)項目中使用。
3. 各位同學(xué)在訪問 Turbine 多微服務(wù)監(jiān)控平臺時,注意訪問地址發(fā)生了變化,大家使用之前的微服務(wù)監(jiān)控平臺訪問地址時訪問不到的,這點需要同學(xué)們注意。
4. 小結(jié)

本小節(jié)以一個真實業(yè)務(wù)場景為大家介紹了 Hystrix 的另一個組件 Turbine ,以及 Turbine 的應(yīng)用方法。Hystrix 的微服務(wù)監(jiān)控平臺一共就包含這兩部分內(nèi)容,而這兩種情況分別對應(yīng)不同的使用場景,同學(xué)們要注意區(qū)分。