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

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

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