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可以有效避免在複雜的分布式叢集環境下的大面積服務癱瘓的問題,隻需要配置即可使用。