SpringCloud(三)Hystrix斷路器

Odousang發表於2021-04-30

Hystrix斷路器

概述

分散式系統面臨的問題

複雜分散式體系結構中的應用程式有數十個依賴關係,每個依賴關係在某些時候將不可避免地失敗

服務雪崩

多個微服務之間呼叫的時候,假設微服務A呼叫微服務B和微服務C,微服務B和微服務C又呼叫其它的微服務,這就是所謂的“扇出”,如果扇出的鏈路上某個微服務的呼叫響應時間過長或者不可用,對微服務A的呼叫就會佔用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”
對於高流量的應用來說,單—的後端依賴可能會導致所有伺服器上的所有資源都在幾秒鐘內飽和。比失敗更糟糕的是,這些應用程式還可能導致服務之間的延遲增加,備份佇列,執行緒和其他系統資源緊張,導致整個系統發生更多的級聯故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關係的失敗,不能取消整個應用程式或系統。
所以,通常當你發現—個模組下的某個例項失敗後,這時候這個模組依然還會接收流量,然後這個有問題的模組還呼叫了其他的模組,這樣就會發生級聯故障,或者叫雪崩。

Hystrix概述

Hystriⅸ是—個用於處理分散式系統的延遲和容錯的開源庫,在分散式系統裡,許多依賴不可避免的會呼叫失敗,比如超時、異常等, Hystriⅸ能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分散式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向呼叫方返回一個符合預期的、可處理的備選響應( FallBack),而不是長時間的等待或者丟擲呼叫方無法處理的異常,這樣就保證了服務呼叫方的執行緒不會被長時間、不必要地佔用,從而避免了故障在分散式系統中的蔓延,乃至雪崩

Hystrix作用

停更說明


官方推薦使用 Resilience4j ,而國內大多數使用 Sentinel

Hystrix重要概念

服務降級

伺服器忙,請稍後再試,不讓客戶端等待並立刻返回一個友好提示, fallback
在以下情況下發生降級:

  • 程式執行異常
  • 超時
  • 服務熔斷觸發服務降級
  • 執行緒池/訊號量打滿也會導致服務降級

服務熔斷

類比保險絲達到最大服務訪問後,直接拒絕訪問,拉閘限電,然後呼叫服務降級的方法並返回友好提示
服務的降級->進而熔斷->恢復呼叫鏈路

服務限流

秒殺高併發等操作,嚴禁一窩蜂的過來擁擠,大家排隊,一秒鐘N個,有序進行

測試案例

  1. 建立一個新的 module
  2. 匯入 hystrix pom依賴
<!-- netflix-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 新增配置檔案
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;
}
  1. 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 來使用

  1. 新建 module
  2. 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
  1. 主啟動類開啟 @EnableFeignClients
  2. 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);
}
  1. 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;
    }
}
  1. 高併發測試
    出現轉圈等待,或者直接消費端爆超時錯誤

    故障現象和導致原因
  • 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客戶端定義的介面新增一個服務降級處理的實現類即可實現解耦,針對介面進行解耦
    解耦以後統一做服務降級
  1. 重新建立一個類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 "服務端連線失敗,請稍後重試";
    }
}
  1. 配置 yml 檔案
# 開啟 hystrix
feign:
  hystrix:
    enabled: true
  1. PaymentHystrixService介面,進行呼叫
@FeignClient(value = "PROVIDER-HYSTRIX-SERVICE",fallback = PaymentFallbackService.class)

測試,正常啟動Eureka叢集,服務端和消費端,測試訪問正常,這時把服務端停掉,模擬當機,客戶端再進行訪問服務端
就會出現剛才配置的當機異常時的服務降級,讓客戶端在服務端不可用時也會獲得提示資訊而不會掛起耗死伺服器

服務熔斷

熔斷機制概述
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當扇岀鏈路的棊個微服務岀錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的呼叫,快速返回錯誤的響應資訊。
當檢測到該節點微服務呼叫響應正常後,恢復呼叫鏈路。
在 Spring Cloud框架裡,熔斷機制通過 Hystrix實現。Hystⅸ會監控微服務間呼叫的狀況當失敗的呼叫到定閾值,預設是5秒內20次呼叫失敗,就會啟動熔斷機制。
熔斷機制的註解是@ HystrixCommand

熔斷測試

  1. 修改服務端 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;
}
  1. 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;
}
  1. 此時當訪問負數時,正常進入方法

    進行連續錯誤十幾次的呼叫後,輸入正數進行呼叫

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

官方說明: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的整合,對監控內容轉化成視覺化介面。

  1. pom依賴
<!-- hystrix-dashboard -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  1. yml 配置檔案
server:
  port: 9001
  1. 主啟動類加上開啟註解 @EnableHystrixDashboard
  2. 測試啟動 訪問 http://localhost:9001/hystrix

監控斷路器測試
注意:新版本 Hystrix 需要在主啟動類中指定監控路徑

  1. 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>
  1. 主啟動類新增配置
@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

相關文章