Hystrix斷路器
概述
分布式系統面臨的問題
復雜分布式體系結構中的應用程序有數十個依賴關系,每個依賴關系在某些時候將不可避免地失敗
服務雪崩
多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的“扇出”,如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”
對於高流量的應用來說,單—的后端依賴可能會導致所有服務器上的所有資源都在幾秒鍾內飽和。比失敗更糟糕的是,這些應用程序還可能導致服務之間的延遲增加,備份隊列,線程和其他系統資源緊張,導致整個系統發生更多的級聯故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關系的失敗,不能取消整個應用程序或系統。
所以,通常當你發現—個模塊下的某個實例失敗后,這時候這個模塊依然還會接收流量,然后這個有問題的模塊還調用了其他的模塊,這樣就會發生級聯故障,或者叫雪崩。
Hystrix概述
Hystriⅸ是—個用於處理分布式系統的延遲和容錯的開源庫,在分布式系統里,許多依賴不可避免的會調用失敗,比如超時、異常等, Hystriⅸ能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分布式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障之后,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個符合預期的、可處理的備選響應( FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地占用,從而避免了故障在分布式系統中的蔓延,乃至雪崩
Hystrix作用
- 服務降級
- 服務熔斷
- 接近實時的監控
- 限流
- 隔離
官方Github:https://github.com/Netflix/Hystrix
停更說明

官方推薦使用 Resilience4j ,而國內大多數使用 Sentinel
Hystrix重要概念
服務降級
服務器忙,請稍后再試,不讓客戶端等待並立刻返回一個友好提示, fallback
在以下情況下發生降級:
- 程序運行異常
- 超時
- 服務熔斷觸發服務降級
- 線程池/信號量打滿也會導致服務降級
服務熔斷
類比保險絲達到最大服務訪問后,直接拒絕訪問,拉閘限電,然后調用服務降級的方法並返回友好提示
服務的降級->進而熔斷->恢復調用鏈路
服務限流
秒殺高並發等操作,嚴禁一窩蜂的過來擁擠,大家排隊,一秒鍾N個,有序進行
測試案例
- 創建一個新的 module
- 導入 hystrix pom依賴
<!-- netflix-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 新增配置文件
server:
port: 8003
spring:
application:
name: provider-hystrix-service
datasource:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&charaterEncoding=utf-8&serverTimezone=Asia/Shanghai
type: com.alibaba.druid.pool.DruidDataSource
# Eureka 省略
# 整合 mybatis
mybatis:
type-aliases-package: com.he.entities
mapper-locations: classpath:mapper/*.xml
4.Service 層
/**
* 正常訪問成功 測試方法
* @param id
* @return
*/
String paymentInfo_success(@Param("id") Long id);
/**
* 測試超時失敗 測試方法
* @param id
* @return
*/
String paymentInfo_Timeout(@Param("id") Long id);
# ServiceImpl類
@Override
public String paymentInfo_success(Long id) {
return "Success線程池" + Thread.currentThread().getName() + "paymentInfo,id:" + id;
}
@Override
public String paymentInfo_Timeout(Long id) {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Timeout線程池" + Thread.currentThread().getName() + "paymentInfo,id:" + id;
}
- Controller 層
/**
* 測試正常連接
* @param id
* @return
*/
@GetMapping(value = "/payment/success/{id}")
public String paymentInfo_success(@PathVariable(value = "id") Long id){
String result = paymentService.paymentInfo_success(id);
log.info(result);
return serverPort;
}
/**
* 超時測試
* @return
*/
@GetMapping(value = "/payment/timeout/{id}")
public String paymentInfo_Timeout(@PathVariable(value = "id") Long id){
String result = paymentService.paymentInfo_Timeout(id);
log.info(result);
return serverPort;
}
模擬復雜業務和簡單業務測試,以這為根基,從正確=>錯誤=>降級熔斷=>恢復
Jmeter 測試高並發情況
服務者測試
Jmeter 壓力測試工具:http://jmeter.apache.org/
測試20000個並發訪問超時測試 paymentInfo_Timeout 的方法

保存測試發送 HTTP 請求

測試結果:
正常訪問的 success 也開始變得緩慢,這種高並發情況下,tomcat的默認的工作線程數被打滿了,沒有多余的線程來分解壓力和處理。
上面還是服務提供者8001自己測試,假如此時外部的消費者80也來訪問那消費者只能干等,最終導致消費端80不滿意,服務端8001直接被拖死
消費者測試
搭配 Feign 來使用
- 新建 module
- pom依賴
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- netflix-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
3.yml 配置
server:
port: 80
spring:
application:
name: consumer-service
# Eureka 省略
# 設置 Feign 客戶端的超時控制(OpenFeign默認支持 Ribbon)
ribbon:
# 指的是建立連接所用的超時時間,適用於網絡狀況正常的情況下,兩端連接所用的時間
ReadTimeout: 5000
# 指的是建立連接后從服務器讀取到可用資源所用的時間
ConnectTimeout: 5000
# 日志功能
logging:
level:
# Feign 日志以什么級別監管哪個接口
com.he.service.PaymentFeignService: debug
- 主啟動類開啟 @EnableFeignClients
- Service 層
@Component
@FeignClient(value = "PROVIDER-HYSTRIX-SERVICE")
public interface PaymentHystrixService {
/**
* 測試正常連接
* @param id
* @return
*/
@GetMapping(value = "/payment/success/{id}")
public String paymentInfo_success(@PathVariable(value = "id") Long id);
/**
* 超時測試
* @return
* @param id
*/
@GetMapping(value = "/payment/timeout/{id}")
public String paymentInfo_timeout(@PathVariable(value = "id") Long id);
}
- Controller 層
@RestController
@Slf4j
public class OrderHystrixController {
@Resource
PaymentHystrixService paymentHystrixService;
/**
* 測試正常連接
* @param id
* @return
*/
@GetMapping(value = "/consumer/payment/success/{id}")
public String paymentInfo_success(@PathVariable(value = "id") Long id){
String result = paymentHystrixService.paymentInfo_success(id);
log.info(result);
return result;
}
/**
* 超時測試
* @return
*/
@GetMapping(value = "/consumer/payment/timeout/{id}")
public String paymentInfo_Timeout(@PathVariable(value = "id") Long id){
String result = paymentHystrixService.paymentInfo_timeout(id);
log.info(result);
return result;
}
}
- 高並發測試
出現轉圈等待,或者直接消費端爆超時錯誤

故障現象和導致原因
- 8001同一層次的其它接口服務被困死,因為tomcat線程池里面的工作線程已經被擠占完畢80,此 時調用8001,客戶端訪問響應緩慢,轉圈圈
- 超時導致服務器變慢(轉圈):超時不再等待
- 出錯(宕機或程序運行出錯):出錯要有兜底
解決方法
服務降級
降級配置:@HystrixCommand
服務提供者
設置自身調用超時時間的峰值,峰值內可以正常運行,超過了需要有兜底的方法處理,作服務降級 fallback
一旦調用服務方法失敗並拋出了錯誤信息后,會自動調用@HystrixCommand標注好的fallback Method調用類中的指定方法
- 業務類
/**
* 此時當這個程序跑滿,要設置一個方法來進行兜底,fallbackMethod = "TimeoutHandler"
* @param id
* @return
*/
@Override
@HystrixCommand(fallbackMethod = "TimeoutHandler")
public String paymentInfo_Timeout(Long id) {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Timeout線程池" + Thread.currentThread().getName() + "paymentInfo,id:" + id;
}
/**
* 超時后的回調處理方法
* @param id
* @return
*/
@Override
public String TimeoutHandler(Long id){
return "TimeoutHandler:" + Thread.currentThread().getName() + "paymentInfo,id:" + id;
}
- 主啟動類激活 @EnableCircuitBreaker

服務消費者
我們自己配置過的熱部署方式對java代碼的改動明顯,旦對@HystrixCommand內屬性的修改建議重啟微服務
- 配置 yml 配置文件
# 開啟 hystrix
feign:
hystrix:
enabled: true
- 業務類
/**
* 超時測試
* @return
*/
@GetMapping(value = "/consumer/payment/timeout/{id}")
@HystrixCommand(fallbackMethod = "TimeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
public String paymentInfo_Timeout(@PathVariable(value = "id") Long id){
String result = paymentHystrixService.paymentInfo_timeout(id);
log.info(result);
return result;
}
/**
* 超時后的回調處理方法
* @param id
* @return
*/
public String TimeoutHandler(Long id){
return "消費者 TimeoutHandler:" + Thread.currentThread().getName() + "系統繁忙或者運行超時,請稍后再試";
}
問題
每個業務方法都需要一個回調的方法,這樣會使得代碼膨脹,重復造輪子
進行統一和自定義分開,進行設置全局fallback方法和特殊自定義方法
通用和獨享的各自分開
全局配置
除了個別重要核心業務有專屬,其它普通的可以通過@DefaultProperties(default Fallback=")統一跳轉到統處理結果頁
- 業務類
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "CommandFallBack")
public class OrderHystrixController {
@Resource
PaymentHystrixService paymentHystrixService;
......
/**
* 全局配置 FallBack 方法
* @return
*/
public String CommandFallBack(){
return "全局異常處理信息,請稍后再試";
}
}

面臨問題
在客戶端這種情況下,雖然解決了不需要每個方法去配置,直接用全局配置,但是與業務邏輯混合在一起,會造成高耦合的情況
還可能面對的異常,運行時異常,超時異常,宕機異常
- 宕機異常
下面針對 Feign 接口進行配置
服務降級,客戶端去調用服務端,碰上服務端宕機或關閉,這案例服務降級處理是在客戶端實現完成的,與服務端沒有關系
只需要為 Feign客戶端定義的接口添加一個服務降級處理的實現類即可實現解耦,針對接口進行解耦
解耦以后統一做服務降級
- 重新創建一個類PaymentFallbackService,實現 Feign 接口,統一為接口里的方法進行異常處理
當調用 PaymentHystrixService接口 里的方法,服務端宕機或者關閉,會直接到 PaymentFallbackService 這個類里返回對應的回調方法
@Component
public class PaymentFallbackService implements PaymentHystrixService {
@Override
public String paymentInfo_success(Long id) {
return "服務端連接失敗";
}
@Override
public String paymentInfo_timeout(Long id) {
return "服務端連接失敗,請稍后重試";
}
}
- 配置 yml 文件
# 開啟 hystrix
feign:
hystrix:
enabled: true
- PaymentHystrixService接口,進行調用
@FeignClient(value = "PROVIDER-HYSTRIX-SERVICE",fallback = PaymentFallbackService.class)
測試,正常啟動Eureka集群,服務端和消費端,測試訪問正常,這時把服務端停掉,模擬宕機,客戶端再進行訪問服務端
就會出現剛才配置的宕機異常時的服務降級,讓客戶端在服務端不可用時也會獲得提示信息而不會掛起耗死服務器

服務熔斷
熔斷機制概述
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當扇岀鏈路的棊個微服務岀錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息。
當檢測到該節點微服務調用響應正常后,恢復調用鏈路。
在 Spring Cloud框架里,熔斷機制通過 Hystrix實現。Hystⅸ會監控微服務間調用的狀況當失敗的調用到定閾值,缺省是5秒內20次調用失敗,就會啟動熔斷機制。
熔斷機制的注解是@ HystrixCommand
熔斷測試
- 修改服務端 Service 層
// 服務熔斷
/**
* 斷路器,服務熔斷,如果出錯,就由 paymentCircuitBreaker_Fallback 這個方法來回調
* (name = "circuitBreaker.enabled",value = "true") :是否開啟斷路器
* (name = "circuitBreaker.requestVolumeThreshold",value = "10") :請求次數
* (name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000") : 時間窗口期
* (name = "circuitBreaker.errorThresholdPercentage",value = "60") : 失敗率達到多少后跳閘
*
* @param id
* @return
*/
@Override
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_Fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
})
public String paymentCircuitBreaker(Long id){
if (id < 0){
throw new RuntimeException("id 不能為負數");
}
return "提供者CircuitBreaker:" + Thread.currentThread().getName();
}
/**
* 斷路器回調的方法
* @param id
* @return
*/
public String paymentCircuitBreaker_Fallback(Long id){
return "id 不能為負數,id:" + id;
}
- controller 層
/**
* 服務熔斷測試
* @param id
* @return
*/
@GetMapping(value = "/payment/circuitBreaker/{id}")
public String paymentCircuitBreaker(@PathVariable(value = "id")Long id){
String result = paymentService.paymentCircuitBreaker(id);
log.info(result);
return result;
}
- 此時當訪問負數時,正常進入方法

進行連續錯誤十幾次的調用后,輸入正數進行調用

可以看到此時服務器已經熔斷,正常訪問已經不行了,過一段時間后,恢復正常

官方說明:https://github.com/Netflix/Hystrix/wiki/How-it-Works

涉及到斷路器的三個重要參數:快照時間窗、請求總數閥值、錯誤百分比閥值
- 快照時間窗(sleepWindowInMilliseconds):斷路器確定是否打開需要統計一些請求和錯誤數據,而統計的時間范圍就是快照時間窗,默認為最近的10秒
- 請求總數閥值(requestVolumeThreshold):在快照時間窗內,必須滿足請求總數閥值才有資格熔斷。默認為20,意味着在10秒內,如果該 hysterⅸ命令的調用次數不足20次,即使所有的請求都超時或其他原因失敗,斷路器都不會打開
- 錯誤百分比閥值(errorThresholdPercentage):當請求總數在快照時間窗內超過了閥值,比如發生了30次調用,如果在這30次調用中,有15次發生了超時異常,也就是超過50%的錯誤百分比,在默認設定50%閥值情況下,這時候就會將斷路器打開
基本流程
- 當滿足一定的閥值的時候(默認10秒內超過20個請求次數)
- 當失敗率達到之定的時候(默認10秒內超過50%的請求失敗)
- 到達以上閥值,斷路器將會開啟
- 當開啟的時候,所有請求都不會進行轉發
- 一段時間之后(默認是5秒),這個時候斷路器是半開狀態,會讓其中一個請求進行轉發如果成功,斷路器會關閉,若失敗,繼續開啟。重復4和5
在 HystrixCommandProperties 這個類中也詳細說明

原理

熔斷類型:
- Open 打開:請求不再進行調用當前服務,內部設置時鍾一般為MTTR(平均故障處理時間),當打開時長達到所設時鍾則進入半熔斷狀態
- Closed 關閉:熔斷關閉不會對服務進行熔斷部分請求
- Half Open 半開:根據規則調用當前服務,如果請求成功且符合規則則認為當前服務恢復正常,關閉熔斷

常用配置
@HystrixCommand(fallbackMethod = "str_ fallbackMethod",
groupKey = "strGroupCommand",
commanakey = "strCommand",
threadPoolKey = "strThreadPool",
commandProperties = {
//設隔離策略,THREAD表示線程池 SEMAPHORE:信號燃隔離
@HystrixProperty (name = "execution.isolation.strategy",value ="THREAD"),
//當隔離策略選擇信號地隔離的時候,用來設置信號地的大小(最大並發數)
@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value ="10"),
//配置命令執行的超時時間
@HystrixProperty(name = "execution.isolation.thread.timeoutinMilliseconds", value="10"),
//是否啟用超時時間
@HystrixProperty(name = "execution.timeout.enabled",value="true"),
//執行超時的時候是否中斷
@HystrixProperty(name = "execution.isolation.thread.interruptonTimeout",value ="true"),
//允許回調方法執行的最大並發數
@HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests",value ="10"),
//服務降級是否啟用,是否執行回調函數
@HystrixProperty(name = "fallback.enabled", value ="true"),
//是否啟用斷路器
@HystrixProperty(name = "circuitBreaker.enabled", value ="true"),
//該屬性用來設置在滾動時間窗中,斷路器熔斷的最小請求數,例如,默認該值為20的時候,
//如果動時間窗(計10秒)內僅收到19個請求,即使這19個請求部失敗了,斷路器也不會打開。
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "20"),
//該屬性用來設置當斷路器打開之后的體眠時間窗。
//休眠時間窗結柬之后,會將斷路器置為"半開”狀態,嘗試熔斷的請求命令,
//如果依然失敗就將斷路器繼續設置為“打開”狀態,如果成功就設置為“關閉”狀態
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
//該屬性用來設置在動時間窗中,
//表示在動時間窗中,在請求數量超過circuitBreaker. requestVolume Threshold的情況下,
//如錯誤請求數的百分比超過50就把斷路器設置為"打開”狀態,否則就設置為"關團”擾態。
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),
//斷路器強制打開
@HystrixProperty(name = "circuitBreaker.forceOpen",value = "false"),
//斷路器強制關閉
@HystrixProperty(name = "circuitBreaker.forceClosed",value = "false"),
//滾動時間窗設置,該時間用於斷路器判斷健康度時需要收集信的持續時間
@HystrixProperty(name = "metrics.rollingStats.timeinMilliseconds",value = "10000"),
//該屬性用來設置滾動時間窗統計指標信息時划分“桶”的數量,斷路器在收集指標信息的時候
//會根據設置的時間窗長度拆分成多個“桶”來累計各度量值,每個“桶”記錄了一段時間內的來集指標
//比如10秒內拆分成10個“桶”收集這樣,所以 timeinMilliseconds必須能被 numBuckets整除。否則會拋異常
@HystrixProperty(name = "metrics.rollingStats.numBuckets",value = "10"),
//該屬性用來設置對命令執行的延遲是否使用百分位數來跟蹤和計算。如果設置為 false,那么所有的概受統計都將返回-1。
@HystrixProperty(name = "metrics.rollingPercentile.enabled",value = "false"),
//該屬性用來設置百分位統計的滾動窗口的持續時間,單位為毫秒。
@HystrixProperty(name = "metrics.rollingPercentile.timeinMilliseconds",value = "60000"),
//該屬性用來沒置百分位統計動口中使用“桶”的數量。
@HystrixProperty(name = "metrics.rollingPercentile.numBuckets",value = "60000"),
//該屬性用來置在執過程中每個“桶”中保的最大執行次數。如在滾動時間窗內發生超過核定值的執行次數,
//就從最初的位置開始重寫。例如,將該值沒置為100,滾動窗口為10秒,若在10秒內一個“桶”中發生了500執行,
//那么該“桶”中只保留最后的100的熱行的統計。另外,增加該值的大小將會增加內存量的消耗,並增加排序百分位數所需的計算時間。
@HystrixProperty(name = "metrics.rollingPercentile.bucketSize",value = "100"),
//該屬性用來設置來采集影響斷路器狀態的健康快照(請求的成功、錯誤百分比)的間隔等待時間
@HystrixProperty(name = "metrics.healthSnapshot.intervalinMilliseconds",value = "500"),
//是否開啟緩存
@HystrixProperty(name = "requestCache.enabled",value = "true"),
//HystrixCommand的執行和事件是否打印日志到 HystrixRequestLog
@HystrixProperty(name = "requestLog.enabled",value = "true"),
},
threadPollProperties = {
//該參數用來設置執行命令線程地的核心線程數,該值也就是命令執行的最大並發量
@HystrixProperty(name = "coreSize",value = "10"),
//該參數用來設置線程地的最大隊列大小。當設置為-1時,線程池將使用 SynchronousQueue實現的隊列,
//否則將使用 LinkedBLockingQueue實現的隊列
@HystrixProperty(name = "maxQueueSize",value = "-1"),
//該參數用來為隊列設置拒絕閥值。過該參數,即使隊列沒有達到最大值也能拒絕請求
//該參數主要是對 LinkedBLockingQueue隊列的補充,
//因為LinkedBlockingQueue隊列不能動態修改它的對象大小,而通過該屬性就可縱調整拒絕請求的隊列大小了。
@HystrixProperty(name = "queueSizeRejectionTreshold,value = "5"),
}
)
服務監控
服務監控hystrixDashboard
除了隔離依賴服務的調用以外, Hystrix還提供了實時的調用監控( Hystrix Dashboard), Hystrix 會持續地記錄所有通過 Hystrix 發記的請求的執行信息,並以統計報表和圖形的形式展示給用戶,包括每秒執行多少請求多少成功,多少失敗等。Netifx通過hystrix-metrics-event-stream項目實現了對以上指標的監控。 Spring Cloudi提供了 Hystrix Dashboard的整合,對監控內容轉化成可視化界面。
- pom依賴
<!-- hystrix-dashboard -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- yml 配置文件
server:
port: 9001
- 主啟動類加上開啟注解 @EnableHystrixDashboard
- 測試啟動 訪問 http://localhost:9001/hystrix

監控斷路器測試
注意:新版本 Hystrix 需要在主啟動類中指定監控路徑
- Pom依賴
圖形化界面需要的依賴
<!-- spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 主啟動類添加配置
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RestController
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
public class ServiceHiApplication {
/**
* 訪問地址 http://localhost:8003/hystrix.stream
* @param args
*/
public static void main(String[] args) {
SpringApplication.run( ServiceHiApplication.class, args );
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
@HystrixCommand(fallbackMethod = "hiError")
public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
return "hi " + name + " ,i am from port:" + port;
}
public String hiError(String name) {
return "hi,"+name+",sorry,error!";
}
}
如果不添加這個配置,監控平台就會出現

3. 監控熔斷器測試 http://localhost:8003/hystrix.stream


