文章大綱
一、Hystrix基礎(chǔ)介紹
二、斷路器Hystrix簡單使用
三、自定義Hystrix請(qǐng)求命令
四、Hystrix的服務(wù)降級(jí)與異常處理
五、Hystrix的請(qǐng)求緩存與請(qǐng)求合并
六、Hystrix儀表盤與Turbine集群監(jiān)控
七、項(xiàng)目源碼與參考資料下載
八、參考文章

一、Hystrix基礎(chǔ)介紹
1. Hystrix簡介
??一個(gè)用戶管理項(xiàng)目,里邊就三個(gè)功能:用戶注冊(cè)、用戶登錄、用戶詳情瀏覽。按照傳統(tǒng)的軟件開發(fā)方式直接創(chuàng)建一個(gè)Web項(xiàng)目,分分鐘就把這三個(gè)功能開發(fā)出來了,但是我現(xiàn)在想使用微服務(wù)+服務(wù)治理的方式來開發(fā):首先我將這個(gè)項(xiàng)目拆分為四個(gè)微服務(wù),四個(gè)微服務(wù)各建一個(gè)模塊,分別是用戶注冊(cè)模塊、用戶登錄模塊、用戶詳情瀏覽模塊和數(shù)據(jù)庫操作模塊,這四個(gè)模塊通過內(nèi)部服務(wù)治理互相調(diào)用。但是現(xiàn)在存在一個(gè)問題,這四個(gè)模塊通過服務(wù)注冊(cè)與訂閱的方式互相依賴,如果一個(gè)模塊出現(xiàn)故障會(huì)導(dǎo)致依賴它的模塊也發(fā)生故障從而發(fā)生故障蔓延,進(jìn)而導(dǎo)致整個(gè)服務(wù)的癱瘓。比如說這里的登錄模塊依賴于數(shù)據(jù)庫模塊,如果數(shù)據(jù)庫模塊發(fā)生故障,那么當(dāng)?shù)卿浤K去調(diào)用數(shù)據(jù)庫模塊的時(shí)候可能得不到響應(yīng),這個(gè)調(diào)用的線程被掛起,如果處于高并發(fā)的環(huán)境下,就會(huì)導(dǎo)致登錄模塊也崩潰。當(dāng)一個(gè)系統(tǒng)劃分的模塊越多,這種故障發(fā)生的頻率就會(huì)越高,對(duì)于這個(gè)問題,Spring Cloud中最重要的解決方案就是斷路。
2. 何時(shí)需要保護(hù)
??對(duì)于一個(gè)系統(tǒng)而言,它往往承擔(dān)著2層角色,服務(wù)提供者與服務(wù)消費(fèi)者。對(duì)于服務(wù)消費(fèi)者而言最大的痛苦就是如何“明哲保身”,做過網(wǎng)關(guān)項(xiàng)目的同學(xué)肯定感同身受

??上面是一個(gè)常見的系統(tǒng)依賴關(guān)系,底層的依賴往往很多,通信協(xié)議包括 socket、HTTP、Dubbo、WebService等等。當(dāng)通信層發(fā)生網(wǎng)絡(luò)抖動(dòng)以及所依賴的系統(tǒng)發(fā)生業(yè)務(wù)響應(yīng)異常時(shí),我們業(yè)務(wù)本身所提供的服務(wù)能力也直接會(huì)受到影響。
??這種效果傳遞下去就很有可能造成雪崩效應(yīng),即整個(gè)業(yè)務(wù)聯(lián)調(diào)發(fā)生異常,比如業(yè)務(wù)整體超時(shí),或者訂單數(shù)據(jù)不一致。
??那么核心問題就來了,如何檢測業(yè)務(wù)處于異常狀態(tài)?
??成功率!成功率直接反映了業(yè)務(wù)的數(shù)據(jù)流轉(zhuǎn)狀態(tài),是最直接的業(yè)務(wù)表現(xiàn)。
??當(dāng)然,也可以根據(jù)超時(shí)時(shí)間做判斷,比如 Sentinel 的實(shí)現(xiàn)。其實(shí)這里概念上可以做一個(gè)轉(zhuǎn)化,用時(shí)間做超時(shí)控制,超時(shí)=失敗,這依然是一個(gè)成功率的概念。
3. 如何保護(hù)
??如同豪豬一樣,“刺”就是他的保護(hù)工具,所有的攻擊都會(huì)被刺無情的懟回去。在 Hystrix 的實(shí)現(xiàn)中,這就出現(xiàn)了“熔斷器”的概念,即當(dāng)前的系統(tǒng)是否處于需要保護(hù)的狀態(tài)。當(dāng)熔斷器處于開啟的狀態(tài)時(shí),所有的請(qǐng)求都不會(huì)真正的走之前的業(yè)務(wù)邏輯,而是直接返回一個(gè)約定的信息,即 FallBack。通過這種快速失敗原則保護(hù)我們的系統(tǒng)。 但是,系統(tǒng)不應(yīng)該永遠(yuǎn)處于“有刺”的狀態(tài),當(dāng)危險(xiǎn)過后需要恢復(fù)正常。于是對(duì)熔斷器的核心操作就是如下幾個(gè)功能:如果成功率過低,就打開熔斷器,阻止正常業(yè)務(wù),隨著時(shí)間的流動(dòng),熔斷器處于半打開狀態(tài),嘗試性放入一筆請(qǐng)求,熔斷器的核心 API 如下圖:

4. 限流、熔斷、隔離、降級(jí)
這四個(gè)概念是我們談起微服務(wù)會(huì)經(jīng)常談到的概念,這里我們討論的是 Hystrix 的實(shí)現(xiàn)方式。
4.1 限流
??這里的限流與 Guava 的 RateLimiter 的限流差異比較大,一個(gè)是為了“保護(hù)自我”,一個(gè)是“保護(hù)下游”
??當(dāng)對(duì)服務(wù)進(jìn)行限流時(shí),超過的流量將直接 Fallback,即熔斷。而 RateLimiter 關(guān)心的其實(shí)是“流量整形”,將不規(guī)整流量在一定速度內(nèi)規(guī)整。
4.2 熔斷
??當(dāng)我的應(yīng)用無法提供服務(wù)時(shí),我要對(duì)上游請(qǐng)求熔斷,避免上游把我壓垮,當(dāng)我的下游依賴成功率過低時(shí),我要對(duì)下游請(qǐng)求熔斷,避免下游把我拖垮。
4.3 降級(jí)
??降級(jí)與熔斷緊密相關(guān),熔斷后業(yè)務(wù)如何表現(xiàn),約定一個(gè)快速失敗的 Fallback,即為服務(wù)降級(jí)。
4.3 隔離
業(yè)務(wù)之間不可互相影響,不同業(yè)務(wù)需要有獨(dú)立的運(yùn)行空間,最徹底的,可以采用物理隔離,不同的機(jī)器部,次之,采用進(jìn)程隔離,一個(gè)機(jī)器多個(gè) Tomcat,次之,請(qǐng)求隔離,由于 Hystrix 框架所屬的層級(jí)為代碼層,所以實(shí)現(xiàn)的是請(qǐng)求隔離,線程池或信號(hào)量。
二、斷路器Hystrix簡單使用
1. 開始前準(zhǔn)備
在之前的文章中我們已經(jīng)成功的搭建出服務(wù)注冊(cè)中心、服務(wù)提供者和服務(wù)消費(fèi)者三個(gè)微服務(wù),本文的案例我們依然在這三個(gè)案例的基礎(chǔ)上來實(shí)現(xiàn)。
首先我們分別啟動(dòng)服務(wù)注冊(cè)中心,再啟動(dòng)兩個(gè)服務(wù)提供者的實(shí)例,端口號(hào)分別是8080和8081,然后再啟動(dòng)一個(gè)服務(wù)消費(fèi)者,服務(wù)消費(fèi)者的端口號(hào)為9000,這幾個(gè)都啟動(dòng)成功之后,我們?cè)L問http://localhost:9000/ribbon-consumer這個(gè)地址,可以看到如下效果:
此時(shí)我們關(guān)閉掉任意一個(gè)服務(wù)提供者,再去訪問這個(gè)地址,會(huì)看到如下效果:

2. Hystrix引入
下列的所有操作都是在ribbon-consumer項(xiàng)目中進(jìn)行
2.1 服務(wù)消費(fèi)者中加入斷路器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2.2 修改服務(wù)消費(fèi)者啟動(dòng)入口類
引入hystrix之后,我們需要在入口類上通過@EnableCircuitBreaker開啟斷路器功能,如下:
@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
我們也可以使用一個(gè)名為@SpringBootApplication的注解代替這三個(gè)注解,@SpringBootApplication注解的定義如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
實(shí)際上就是這三個(gè)注解的一個(gè)整合
2.3 修改Controller
我們創(chuàng)建一個(gè)HelloService類,如下:
@Service
public class HelloService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "error")
public String hello() {
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
return responseEntity.getBody();
}
public String error() {
return "error";
}
}
關(guān)于這個(gè)HelloService類我說如下幾點(diǎn):
(1)RestTemplate執(zhí)行網(wǎng)絡(luò)請(qǐng)求的操作我們放在HelloService中來完成。
(2)error方法是一個(gè)請(qǐng)求失敗時(shí)回調(diào)的方法。
(3)在hello方法上通過@HystrixCommand注解來指定請(qǐng)求失敗時(shí)回調(diào)的方法。
最后我們將ConsumerController的邏輯修改成下面這樣:
@RestController
public class ConsumerController {
@Autowired
private HelloService helloService;
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloController() {
return helloService.hello();
}
}
此時(shí)我們就開啟了斷路器功能
2.4 啟動(dòng)項(xiàng)目并測試斷路器
啟動(dòng)項(xiàng)目后,我們的訪問是正常的

現(xiàn)在我們將其中一個(gè)服務(wù)提供者干掉

重新訪問http://localhost:9000/ribbon-consumer

OK,小伙伴們看到,此時(shí)如果服務(wù)調(diào)用失敗,就會(huì)調(diào)用失敗的那個(gè)回調(diào)方法。事實(shí)上,不僅僅是服務(wù)提供者被關(guān)閉時(shí)我們需要斷路器,如果請(qǐng)求超時(shí)也會(huì)觸發(fā)熔斷請(qǐng)求,調(diào)用回調(diào)方法返回?cái)?shù)據(jù)。
三、自定義Hystrix請(qǐng)求命令
1. 簡介
在上面內(nèi)容中,我們介紹了斷路器Hystrix的一個(gè)簡單使用,主要是通過注解來實(shí)現(xiàn)斷路器的功能的,不過對(duì)于Hystrix的使用,除了注解,我們也可以使用繼承類的方式來實(shí)現(xiàn),本文我們就來看看另一種Hystrix的使用方式。
2. 自定義斷路器Hystrix
我們除了使用@HystrixCommand注解,也可以自定義類繼承自HystrixCommand,創(chuàng)建BookCommand.java
package test.custom;
import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;
import java.awt.print.Book;
/**
* 自定義斷路器Hystrix
*
* 在BookCommand中注入RestTemplate,然后重寫兩個(gè)方法:一個(gè)是getFallback,這個(gè)方法將在服務(wù)調(diào)用失敗時(shí)回調(diào);
* 另一個(gè)是run方法,執(zhí)行請(qǐng)求時(shí)調(diào)用。構(gòu)造方法的第一個(gè)參數(shù)主要用來保存一些分組信息。
*/
public class BookCommand extends HystrixCommand<String> {
private RestTemplate restTemplate;
@Override
protected String getFallback() {
return "測試出問題了";
}
public BookCommand(Setter setter, RestTemplate restTemplate) {
super(setter);
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
}
}
在BookCommand中注入RestTemplate,然后重寫兩個(gè)方法:一個(gè)是getFallback,這個(gè)方法將在服務(wù)調(diào)用失敗時(shí)回調(diào);另一個(gè)是run方法,執(zhí)行請(qǐng)求時(shí)調(diào)用。構(gòu)造方法的第一個(gè)參數(shù)主要用來保存一些分組信息。
3. 同步調(diào)用和異步調(diào)用
當(dāng)BookCommand創(chuàng)建成功之后,我們就可以在我們的Controller中調(diào)用它了,創(chuàng)建BookCommandController.java
package test.controller;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import test.custom.BookCommand;
import java.awt.print.Book;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* 測試自定義斷路器Hystrix
*/
@RestController
public class BookCommandController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/test1",method = RequestMethod.GET)
public String test1() throws ExecutionException, InterruptedException {
// 1.獲取到BookCommand對(duì)象之后,我們有兩種方式來執(zhí)行請(qǐng)求,一種是調(diào)用execute方法發(fā)起一個(gè)同步請(qǐng)求,另一種是調(diào)用queue方法發(fā)起一個(gè)異步請(qǐng)求。
// 2.同步請(qǐng)求中可以直接返回請(qǐng)求結(jié)果。
// 3.異步請(qǐng)求中我們需要通過get方法來獲取請(qǐng)求結(jié)果,在調(diào)用get方法的時(shí)候也可以傳入超時(shí)時(shí)長。
BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);
//同步調(diào)用
//Book book1 = bookCommand.execute();
//異步調(diào)用
Future<String> queue = bookCommand.queue();
String string = queue.get();
return string;
}
}
溫馨提示:
(1)獲取到BookCommand對(duì)象之后,我們有兩種方式來執(zhí)行請(qǐng)求,一種是調(diào)用execute方法發(fā)起一個(gè)同步請(qǐng)求,另一種是調(diào)用queue方法發(fā)起一個(gè)異步請(qǐng)求。
(2)同步請(qǐng)求中可以直接返回請(qǐng)求結(jié)果。
(3)異步請(qǐng)求中我們需要通過get方法來獲取請(qǐng)求結(jié)果,在調(diào)用get方法的時(shí)候也可以傳入超時(shí)時(shí)長。
4. 項(xiàng)目運(yùn)行與訪問
保持原本項(xiàng)目啟動(dòng)情況,即關(guān)閉一個(gè)服務(wù)提供者,之后重新運(yùn)行ribbon-cunsumer,再訪問http://localhost:9000/test1,出現(xiàn)以下結(jié)果

四、Hystrix的服務(wù)降級(jí)與異常處理
1. 服務(wù)降級(jí)
fallbackMethod所描述的函數(shù)實(shí)際上就是一個(gè)備胎,用來實(shí)現(xiàn)服務(wù)的降級(jí)處理,在注解中我們可以通過fallbackMethod屬性來指定降級(jí)處理的方法名稱,在自定義Hystrix請(qǐng)求命令時(shí)我們可以通過重寫getFallback函數(shù)來處理服務(wù)降級(jí)之后的邏輯。使用注解來定義服務(wù)降級(jí)邏輯時(shí),服務(wù)降級(jí)函數(shù)和@HystrixCommand注解要處于同一個(gè)類中,同時(shí),服務(wù)降級(jí)函數(shù)在執(zhí)行過程中也有可能發(fā)生異常,所以也可以給服務(wù)降級(jí)函數(shù)添加‘備胎’

2. 異常處理
我們?cè)谡{(diào)用服務(wù)提供者時(shí)有可能會(huì)拋異常,默認(rèn)情況下方法拋了異常會(huì)自動(dòng)進(jìn)行服務(wù)降級(jí),交給服務(wù)降級(jí)中的方法去處理,在自定義Hystrix請(qǐng)求命令的方式下,我們可以在getFallback方法中調(diào)用getExecutionException方法來獲取拋出的異常,舉個(gè)簡單的例子:
package test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import test.service.HelloService;
import test.service.HelloServiceImpl;
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
// @RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
// public String helloController() {
// return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
// }
@Autowired
private HelloService helloService;
//測試短路訪問
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloController() {
return helloService.hello();
}
}
重新啟動(dòng)ribbon-cunsumer項(xiàng)目,此時(shí)訪問http://localhost:9000/test1,控制臺(tái)顯示結(jié)果如下:

五、Hystrix的請(qǐng)求緩存與請(qǐng)求合并
1. 請(qǐng)求緩存
??高并發(fā)環(huán)境下如果能處理好緩存就可以有效的減小服務(wù)器的壓力,Java中有許多非常好用的緩存工具,比如Redis、EHCache等,當(dāng)然在Spring Cloud的Hystrix中也提供了請(qǐng)求緩存的功能,我們可以通過一個(gè)注解或者一個(gè)方法來開啟緩存,進(jìn)而減輕高并發(fā)環(huán)境下系統(tǒng)的壓力。OK,本文我們就來看看Hystrix中請(qǐng)求緩存的使用。
??請(qǐng)求緩存具體內(nèi)容可參考https://mp.weixin.qq.com/s/YpWODLrwzFXUQRtIAHLF3Q?
2. 請(qǐng)求合并
??我們將一個(gè)項(xiàng)目拆分成很多個(gè)獨(dú)立的模塊,這些獨(dú)立的模塊通過遠(yuǎn)程調(diào)用來互相配合工作,但是,在高并發(fā)情況下,通信次數(shù)的增加會(huì)導(dǎo)致總的通信時(shí)間增加,同時(shí),線程池的資源也是有限的,高并發(fā)環(huán)境會(huì)導(dǎo)致有大量的線程處于等待狀態(tài),進(jìn)而導(dǎo)致響應(yīng)延遲,為了解決這些問題,我們需要來了解Hystrix的請(qǐng)求合并。
??請(qǐng)求合并具體內(nèi)容可參考https://mp.weixin.qq.com/s/0QSKVLaDjBAscRaeccaXuA?
六、Hystrix儀表盤與Turbine集群監(jiān)控
1. 簡介
Hystrix儀表盤,就像汽車的儀表盤實(shí)時(shí)顯示汽車的各項(xiàng)數(shù)據(jù)一樣,Hystrix儀表盤主要用來監(jiān)控Hystrix的實(shí)時(shí)運(yùn)行狀態(tài),通過它我們可以看到Hystrix的各項(xiàng)指標(biāo)信息,從而快速發(fā)現(xiàn)系統(tǒng)中存在的問題進(jìn)而解決它,OK,本文我們就來看看Hystrix儀表盤要怎么使用。
2. 創(chuàng)建最基本的Hystrix項(xiàng)目
2.1 新建springboot項(xiàng)目,項(xiàng)目名稱為hystrix-dashboard




創(chuàng)建后項(xiàng)目結(jié)構(gòu)如下:

2.2 pom.xml文件添加依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wxc</groupId>
<artifactId>hystrix-dashboard</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR3</version>
<relativePath/>
</parent>
<dependencies>
<!-- 其他默認(rèn)依賴 -->
<!-- 我們需要添加的依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
2.3 創(chuàng)建項(xiàng)目啟動(dòng)類
com.wxc.test包下新建HystrixDashboardApplication.java
package com.wxc.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}
2.4 項(xiàng)目啟動(dòng)與訪問

瀏覽器輸入http://localhost:2001/進(jìn)行訪問,訪問成功后結(jié)果如下:

三個(gè)參數(shù)的含義我已在圖中標(biāo)注出來了。
OK,現(xiàn)在我們的儀表盤工程已經(jīng)創(chuàng)建成功了,但是還不能用來監(jiān)控某一個(gè)服務(wù),要監(jiān)控某一個(gè)服務(wù),需要該服務(wù)提供一個(gè)/hystrix.stream接口,so,我們需要對(duì)我們的服務(wù)消費(fèi)者工程稍加改造。
3.改造要監(jiān)控的服務(wù)
3.1 改造服務(wù)消費(fèi)者工程ribbon-consumer
在pom.xml文件中添加以下依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在確保服務(wù)注冊(cè)中心和服務(wù)提供者開啟情況下,在服務(wù)消費(fèi)者工程的入口類上添加@EnableCircuitBreaker注解,表示開啟斷路器功能。此時(shí)項(xiàng)目啟動(dòng)情況如下:

這個(gè)信息表明我們的consumer工程目前已經(jīng)具備了/hystrix.stream接口,我們可以直接訪問這個(gè)接口了。但是這里有一個(gè)細(xì)節(jié)需要小伙伴們注意:要訪問/hystrix.stream接口,得先訪問consumer工程中的任意一個(gè)其他接口,否則如果直接訪問/hystrix.stream接口的話,會(huì)打印出一連串的ping: ping: …。 OK,我先訪問consumer中的任意一個(gè)其他接口,然后在訪問/hystrix.stream接口,訪問地址如下:http://localhost:9000/hystrix.stream,訪問結(jié)果如下:


3.2 hystrix-dashboard服務(wù)監(jiān)控
在hystrix儀表盤中輸入監(jiān)控地址,如下:

然后點(diǎn)擊Monitor Stream按鈕,我們就可以看到監(jiān)控畫面了,如下:

3.3 監(jiān)控參數(shù)詳解

4. Turbine集群監(jiān)控
OK,上文我們看了一個(gè)監(jiān)控單體應(yīng)用的例子,在實(shí)際應(yīng)用中,我們要監(jiān)控的應(yīng)用往往是一個(gè)集群,這個(gè)時(shí)候我們就得采取Turbine集群監(jiān)控了。Turbine有一個(gè)重要的功能就是匯聚監(jiān)控信息,并將匯聚到的監(jiān)控信息提供給Hystrix Dashboard來集中展示和監(jiān)控。那我們就來看看Turbine集群監(jiān)控如何使用。
搭建監(jiān)控環(huán)境
監(jiān)控環(huán)境的搭建也是分為四個(gè)步驟:
第一步:創(chuàng)建一個(gè)普通的Spring Boot工程
第一步創(chuàng)建一個(gè)名叫turbine的普通Spring Boot工程。
第二步:添加依賴
工程創(chuàng)建完成之后,我們需要添加一個(gè)依賴,如下:
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR3</version>
<relativePath/>
</parent>
<dependencies>
<!-- 其他默認(rèn)的依賴 -->
<!-- 我們要添加的依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
</dependencies>
第三步:添加注解
在入口類上添加@EnableTurbine注解表示開啟Turbine,如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableTurbine
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
第四步:修改配置
在application.properties配置文件中加入eureka和turbine的相關(guān)配置,如下:
spring.application.name=turbine
server.port=2002
management.port=2003
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
turbine.app-config=ribbon-consumer
turbine.cluster-name-expression="default"
turbine.combine-host-port=true
關(guān)于這個(gè)配置文件,我說如下幾點(diǎn):
1.turbine.app-config=ribbon-consumer指定了要監(jiān)控的應(yīng)用名字為ribbon-consumer
2.turbine.cluster-name-expression=”default”,表示集群的名字為default
3.turbine.combine-host-port=true表示同一主機(jī)上的服務(wù)通過host和port的組合來進(jìn)行區(qū)分,默認(rèn)情況下是使用host來區(qū)分,這樣會(huì)使本地調(diào)試有問題
查看監(jiān)控圖
OK,監(jiān)控服務(wù)創(chuàng)建成功之后,我們?cè)俅我来螁?dòng)eureka-server、provider和consumer,其中consumer啟動(dòng)兩個(gè)實(shí)例,兩個(gè)實(shí)例的端口不一致,再分別啟動(dòng)hystrix-dashboard和turbine,然后在hystrix監(jiān)控地址欄輸入如下地址(監(jiān)控之前要記得先訪問一下服務(wù)中的任意一個(gè)接口):http://localhost:2002/turbine.stream,訪問結(jié)果如下:

七、項(xiàng)目源碼與參考資料下載
鏈接:https://pan.baidu.com/s/120z7NZZ_-Z_BHySQHHazZw
提取碼:flic