五、Spring Cloud組件 - Hystrix

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(平均故障時間),當打開時長達到所設時鐘則進入半熔斷狀態
  • 熔斷關閉:熔斷關閉不會對服務進行熔斷
  • 熔斷半開:部分請求根據規則調用當前服務,如果請求成功且符合規則認爲當前服務恢復正常,關閉熔斷

在這裏插入圖片描述

熔斷在什麼情況下開始起作用

在這裏插入圖片描述

  1. 當滿足一定的閥值的時候(默認10秒超過20個請求次數)
  2. 當失敗率達到一定的時候(默認10秒內超過50%的請求失敗)
  3. 到達以上閥值,斷路器將會開啓
  4. 當開啓的時候,所有的請求不會再進行轉發
  5. 一般時間後(默認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;
}

七色、一圈、一線

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章