hystrix是什麼?
Hystrix是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,比如超時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分佈式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。
降級,超時
我們先來解釋一下降級,降級是當我們的某個微服務響應時間過長,或者不可用了,講白了也就是那個微服務調用不了了,我們不能把錯誤信息返回出來,或者讓他一直卡在那裏,所以要在準備一個對應的策略(一個方法)當發生這種問題的時候我們直接調用這個方法來快速返回這個請求,不讓他一直卡在那 。
停更維護
https://github.com/Netflix/Hystrix
Hystrix is no longer in active development, and is currently in maintenance mode.
服務降級(fallback)
- 程序運行異常
- 超時
- 服務熔斷觸發服務降級
- 線程池/信號量打滿也會導致降級
解決
- 被調用服務超時了,調用者不能一直卡死等待,必須有服務降級
- 被調用服務down機了,調用者不能一直卡死等待,必須有服務降級。
- 被調用服務OK,調用者自己出故障或有自我要求(自己的等待時間小於服務提供者),自己服務降級。
服務熔斷(break)
- 斷路器 (保險絲)
- 熔斷機制概述:熔斷機制是應對雪崩效應的一種微服務鏈路保護機制,當扇出鏈路的某個微服務出錯不可用或者響應時間太長,會產生服務降級。進而熔斷該節點微服務調用,快速返回錯誤響應信息。當檢測到該節點微服務調用響應正常後,恢復調用鏈路
- 在Spring Cloud框架中。熔斷機制通過Hystrix實現,Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,缺省值5秒內20次調用失敗,就會啓動熔斷機制,熔斷機制的註解是@HystrixCommand
服務降級提倡者:https://martinfowler.com/bliki/CircuitBreaker.html
熔斷狀態
- 熔斷打開:請求不在進行調用當前服務,內部設置時鐘一般爲MTTR(平均故障時間),當打開時長達到所設時鐘則進入半熔斷狀態
- 熔斷關閉:熔斷關閉不會對服務進行熔斷
- 熔斷半開:部分請求根據規則調用當前服務,如果請求成功且符合規則認爲當前服務恢復正常,關閉熔斷
熔斷在什麼情況下開始起作用
- 當滿足一定的閥值的時候(默認10秒超過20個請求次數)
- 當失敗率達到一定的時候(默認10秒內超過50%的請求失敗)
- 到達以上閥值,斷路器將會開啓
- 當開啓的時候,所有的請求不會再進行轉發
- 一般時間後(默認5秒),這個時候斷路器是半開狀態,會讓其中一個請求進行轉發,如果成功,斷路器會關閉,如果失敗,繼續開啓,重複4和5
hystrix所有配置參數詳解:https://blog.csdn.net/tongtong_use/article/details/78611225
服務限流(flowlimit)
實時化監控
hystrix可以搭建可視化界面
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
啓動類上增加
@EnableHystrixDashboard
Spring Cloud F版後需要配置Bean
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet hystrixMetricsStreamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(hystrixMetricsStreamServlet);
servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.addUrlMappings("/hystrix.stream");
servletRegistrationBean.setName("HystrixMetricsStreamServlet");
return servletRegistrationBean;
}
七色、一圈、一線