目錄
雪崩問題
一個服務,依賴於另一個功能服務的,如果這個功能服務掛掉了,那么依賴的服務就不能再用了,這種級聯的失敗, 我們可以稱之為雪崩
Hystrix概述
- Hystrix是一個用於處理分布式系統的延遲和容錯的開源庫,在分布式系統里,許多依賴不可避免的會調用失敗,比如超時、異常等
- Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分布式系統的彈性。
降級
什么是降級?
- 降級是當我們的某個微服務響應時間過長,或者不可用了也就是那個微服務調用不了了,
- 我們不能吧錯誤信息返回出來,或者讓他一直卡在那里,所以要在准備一個對應的策略(一個方法)
- 當發生這種問題的時候我們直接調用這個方法來快速返回這個請求,不讓他一直卡在那
- 當某個微服務調用不了了要做降級,也就是說,要在調用方做降級(不然那個微服務都down掉了再做降級也沒什么意義了)
降級步驟
- 在服務調用方法添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 啟動類加入注解@EnableHystrix
@EnableHystrix
- 在控制器調用方法上添加注解@HystrixCommand
- 在goods服務當中模擬一個異常
啟動運行
超時監聽
-
模擬響應過慢
當響應過慢(默認值是1000),訪問時,也會進入到指定的降級方法當中 -
在客戶端配置文件當中配置超時時間
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 9000 # 設置hystrix的超時時間為9000ms
ribbon:
ReadTimeout: 10000
ConnectTimeout: 10000
使用Fengin調用
Feign默認也有對Hystix的集成,1默認情況下是關閉的。我們需要通過下面的參數來開啟:
feign:
hystrix:
enabled: true # 開啟Feign的熔斷功能
運行
把goods的睡眠時間改成1000 運行:
運行:
熔斷
概述:
- 也叫斷路器,CirleBreak
- 熔斷,就好像我們生活中的跳閘一樣, 比如說你的電路出故障了,為了防止出現大型事故 這里直接切斷了你的電源以免意外繼續發生
- 當一個微服務調用多次出現問題時(默認是10秒內20次當然 這個也能配置),hystrix就會采取熔斷機制
- 不再繼續調用你的方法, 而是直接調用降級方法,這樣就一定程度上避免了服務雪崩的問題
- 會在默認5秒鍾內和電器短路一樣,5秒鍾后會試探性的先關閉熔斷機制,但是如果這時候再失敗一次{之前是20次} 那么又會重新進行熔斷
線程隔離降級處理, 如果請求延遲過高,如果超時,返回一個異常信息:
- 假設超時2秒, 但是用戶也要等3秒才會返回異常信息
- 正常情況下, 一個請求只需要30ms就夠了, 因為超時, 導致要多等2秒多,並發能力急劇下降,如果每次來都超時, 就認為這個服務可能存在問題,就可以認為 電路中負載最高的電壓
- 此時, 就把此服務斷開,再去訪問時, 就不需要等待3秒,直接返回異常信息,把失敗的時長急劇縮短 保證其它服務的高可用,這個服務就被臨時斷掉 4 斷開很容易, 解決如何斷開后, 再去給它連接回來, Hystrix就可以去解決這種問題
熔斷配置
配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 9000 #設置超時時長
circuitBreaker:
requestVolumeThreshold: 5 # 10秒種訪問5次都失敗的話, 會斷開服務,不調用方法,直接進入fallback
sleepWindowInMilliseconds : 5000 #默認是5秒 5秒后嘗試再訪問一次服務器
goods模擬異常
- 調用5次后,就不再調用goods方法 持續調用后,中間還會調用一次goods方法 ,之后, 就不會再調用
- 默認5秒鍾后會試探性的先關閉熔斷機制,但是如果這時候再失敗一次{之前是20次} 那么又會重新進行熔斷
限流
概念:
- 限流, 顧名思義, 就是限制你某個微服務的使用量(可用線程)
- hystrix通過線程池的方式來管理你的微服務調用,他默認是一個線程池(10大小) 管理你的所有微服務
- 一個線程可以理解為一個請求,當10請求同時訪問, 都沒有得要響應的時候,就會自動調用fallback方法
默認什么都不設置
當訪問請求次數超過10的時候 , 會調用fallback方法
feign整合hystrix
feign 默認是支持hystrix的, 但是在Spring - cloud Dalston 版本之后就默認關閉了, 因為不一定業務需求要用的到
- 開啟feign 對hystrix的支持
feign:
hystrix:
enabled: true #開啟feign當中的hystrix
方式1-fallback
- 創建一個類實現服務FeignClient接口
- 在控制器當中調用
第一次運行
連續刷新11次后
方式2-fallbackFactory
- 創建一個類實現FallbackFactory
- 在服務FeignClient接口上配置實現類
- 在控制器當中調用
效果和第一種方式一樣