hystrix 簡介
Hystrix是什么
在分布式環境中,許多服務依賴項中的一些必然會失敗。Hystrix是一個庫,通過添加延遲容忍和容錯邏輯,幫助你控制這些分布式服務之間的交互。Hystrix通過隔離服務之間的訪問點、停止級聯失敗和提供回退選項來實現這一點,所有這些都可以提高系統的整體彈性。
Hystrix為了什么
Hystrix被設計的目標是:
- 對通過第三方客戶端庫訪問的依賴項(通常是通過網絡)的延遲和故障進行保護和控制。
- 在復雜的分布式系統中阻止級聯故障。
- 快速失敗,快速恢復。
- 回退,盡可能優雅地降級。
- 啟用近實時監控、警報和操作控制。
Hystrix解決了什么問題
復雜分布式體系結構中的應用程序有許多依賴項,每個依賴項在某些時候都不可避免地會失敗。如果主機應用程序沒有與這些外部故障隔離,那么它有可能被他們拖垮
接下來開打:整合springcloud
在工程中引用jar包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
服務的降級使用:
啟動類上加入 @EnableHystrix注解 開啟hystrix功能
在controller的方法上加入注解:
@HystrixCommand
fallbackMethod 屬性 代表降級要調用的方法:比如
@GetMapping("/getHystrix/{id}")
@HystrixCommand(fallbackMethod = "demotionMethod",
commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 開啟熔斷
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 在規定時間的請求次數
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "6000"), // 規定的時間
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),}) // 規定的時間失敗率
public String getHystrix(@PathVariable(name = "id") Integer id) throws InterruptedException {
if (id <= 0)
throw new RuntimeException();
String hystrix = consumerFeign.getHystrix(234);
return hystrix;
}
public String demotionMethod(Integer id) throws InterruptedException {
return "哦豁 服務遇到點小麻煩。。。"+Thread.currentThread().getName();
}
demotionMethod 方法就是服務降級時候調用的方法
調用接口超時時間設置 在yml中:
#此項內容也可以通過注解去設置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 #服務降級時間2秒
這樣服務的降級功能就完成了 當發生異常 響應超時,和一些錯誤信息的時候 就會自動調用降級的方法返回給調用方
hystrix的服務熔斷限流
@HystrixCommand(fallbackMethod = "demotionMethod",
commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 開啟熔斷
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 在規定時間的請求次數
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "6000"), // 規定的時間
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),}) // 規定的時間失敗率
這些就是配置服務的熔斷的參數也是在
@HystrixCommand 中配置
commandProperties 的屬性:
注意:熔斷功能要在yml中開啟:
feign:
client:
config:
default:
connectTimeout: 5000 #連接超時時間
readTimeout: 5000 #請求與響應的時間間隔閾值
hystrix:
enabled: true # 開啟服務的熔斷機制
這些配置的參數記不住沒關系的 你只需要記住一個類就可以了:
HystrixCommandProperties類中定義了需要配置的所有屬性,以及默認的屬性值:
熔斷機制默認是10秒發送20次請求,有百分之50的請求失敗就會進入到斷開的狀態
熔斷器原理
熔斷器模式定義了熔斷器開關相互轉換的邏輯:
服務的健康狀況 = 請求失敗數 / 請求總數.
熔斷器開關由關閉到打開的狀態轉換是通過當前服務健康狀況和設定閾值比較決定的.
1、當熔斷器開關關閉時, 請求被允許通過熔斷器. 如果當前健康狀況高於設定閾值, 開關繼續保持關閉. 如果當前健康狀況低於設定閾值, 開關則切換為打開狀態.
2、當熔斷器開關打開時, 請求被禁止通過.
3、當熔斷器開關處於打開狀態, 經過一段時間后, 熔斷器會自動進入半開狀態, 這時熔斷器只允許一個請求通過. 當該請求調用成功時, 熔斷器恢復到關閉狀態. 若該請求失敗, 熔斷器繼續保持打開狀態, 接下來的請求被禁止通過.熔斷器的開關能保證服務調用者在調用異常服務時, 快速返回結果, 避免大量的同步等待.並且熔斷器能在一段時間后繼續偵測請求執行結果, 提供恢復服務調用的可能.
打完收工