天天看點

spring cloud Hystrix 熔斷器

1,Spring Cloud Hystrix是什麼

spring cloud Hystrix是netflix服務套件中的一部分。spring cloud基于Netflix Hystrix做了封裝。Hystrix是用于服務保護,避免服務雪崩效應(個别服務的不可用,導緻整體依賴該服務的不可用,進而擴大到整個系統不可用)。避免服務雪崩效應的方式大體有如下處理:

服務降級:當系統通路高峰期,為了確定高峰期重要、核心服務的正常運作,拒絕或者關閉不重要的服務,将資源用于重要核心服務。當拒絕(不完全關閉,可以允許少量通路)或者關閉服務時,對被降級服務的請求直接在用戶端調用本地方法傳回,不實際執行調用。(比如Spring Cloud環境下,關閉了服務,則在Eureka注冊中心,該服務已經不存在,Hystrix會直接使通路直接調用對應本地fallback方法傳回)。

服務熔斷:當某個服務異常或者逾時等達到設定值,則關閉對該服務的調用,直接調用本地方法傳回,避免服務堆積等引起級聯的服務奔潰。Hystrix監控在指定時間内,服務異常達到設定值,則自動熔斷服務,在設定時間内,不調用被熔斷的服務,直接調用本地fallback方法傳回;在設定時間段結束後,進入半開啟狀态,部分嘗試調用該服務,如果服務正常,則開啟,否則再次關閉。

服務限流:由于服務的資源環境有限,為避免大量的通路,導緻服務堆積奔潰,采用限制通路的方式,避免将所有的請求都直接堆積到該服務。(服務限流,也可以通過API網關Zuul實作,自定義ZuulFilter來實作限流)

2,Hystrix 熔斷器

Hystrix熔斷器在用戶端實作,在Spring Cloud中,通過Feign整合Hystrix,實作服務降級、熔斷、限流等功能。啟動類在Feign的基礎上不需要再特殊處理。

1,pom檔案配置

<!-- feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- hystrix 單獨hystrix配置-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
           

2,yaml配置:

feign: 
  hystrix: 
    enabled: true
# 配置hystrix的參數
hystrix:
  #配置線程池大小、緩存區大小、緩沖區超限門檻值
  threadpool:
    default:
      coreSize: 
      maxQueueSize: 
      queueSizeRejectionThreshold: 
      #配置執行政策
      execution: 
        #逾時打開
        timeout: 
          enabled: true
        # 資源隔離模式,預設thread。還有semaphore(信号量)
        isolation: 
          strategy: THREAD
          thread: 
            #逾時時間、逾時中斷線程、取消時中斷線程、
            timeoutInMilliseconds: 
            interruptOnTimeout: true
  command:
    default:
      fallback:
        # 開啟服務降級
        enabled: true
      circuitBreaker: 
         # 開啟熔斷,關閉強制開啟、關閉熔斷
        enabled: true
        forceOpen: false
        forceClosed: false
        #視窗期内,至少10次請求熔斷器才發生作用
        requestVolumeThreshold:  
        #錯誤率達到50%,熔斷器斷開
        errorThresholdPercentage: 
        #熔斷5s後,進入半打開狀态
        sleepWindowInMilliseconds: 
      #度量政策
      metrics: 
        rollingStats: 
          #度量視窗時間周期5s、度量桶數量、
          timeInMilliseconds: 
          numBuckets: 
           

4,用戶端服務調用接口FallbackFactory

@Component
public class ClientServiceFallbackFactory implements FallbackFactory<ClientService>
{
    @Override
    public ClientService create(Throwable throwable)
    {
        return new ClientService() {
            @Override
            public String getInfo(long id)
            {
                return "服務降級了";
            }
        };
    }
}
           

5,Feign用戶端引入ClientServiceFallbackFactory

@FeignClient(value = "SERVICE-PROVIDER",fallbackFactory=ClientServiceFallbackFactory.class)
public interface ClientService
{
    public String getInfo(long id);
}
           

3,總結

Spring Cloud Hystrix可以有效避免在複雜的分布式叢集環境下的大面積服務癱瘓的問題,隻需要配置即可使用。

繼續閱讀