前言:不端學習就是程序員的宿命。
一、概述
參考之前鄙人博客:SpringCloud全家桶學習之斷路器---Hystrix(五)
Hystrix的Github地址:https://github.com/Netflix/hystrix/wiki,現已停更進維
(1)服務降級:服務器忙,請稍后再試,不讓客戶端等待並立刻返回一個友好提示,fallback。哪些情況會觸發降級?例:程序運行異常、超時、服務熔斷觸發服務降級、線程池/信號量打滿也會導致服務降級。服務的降級處理是在客戶端實現完成,與服務端沒有關系。在服務熔斷機制下,每個方法都要有一個對應的注解HystrixCommand和fallback方法,這樣顯然是不合適的,而且對本身業務也有侵入性。所以服務降級可以實現上述邏輯的解耦和分離。而這里又是面向接口編程,所以自然想到了將異常等處理邏輯與接口進行綁定,即可實現對業務本身無侵入,實現解耦。
(2)服務熔斷:類似保險絲達到最大服務訪問后,直接拒絕訪問,然后調用服務降級的方法並返回友好提示。服務熔斷:熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當扇出鏈路的某個微服務不可用或響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回“錯誤”的響應信息。當檢測到該節點的微服務調用響應正常后恢復調用鏈路。在Spring Cloud框架里熔斷機制通過Hystix實現。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定的閾值,缺省是5秒內20次調用失敗就會啟動熔斷機制。熔斷機制的注解是@HystrixCommand
熔斷類型:
①熔斷打開:請求不再調用當前服務,內部設置一般為MTTR(平均故障處理時間),當打開長達導所設時鍾則進入半熔斷狀態
②熔斷關閉:熔斷關閉后不會對服務進行熔斷
③熔斷半開:部分請求根據規則調用當前服務,如果請求成功且符合規則則認為當前服務恢復正常,關閉熔斷
大神論文:https://martinfowler.com/bliki/CircuitBreaker.html
熔斷官網流程圖地址:https://github.com/Netflix/Hystrix/wiki/How-it-Works
流程圖分析:
(3)服務限流:秒殺高並發等操作,嚴禁一窩蜂的過來擁擠,大家排隊,一秒鍾N個,有序進行。
(4)服務監控DashBoard
二、服務降級
1、provider端服務降級:@HystrixCommand注解
2、consumer端服務降級:@HystrixCommand+@EnableHystrix+配置文件
2.1 application.yml新增如下配置:
feign: hystrix: # 在feign中開啟Hystrix enabled: true
2.2主啟動類添加@EnableHystrix
2.3使用@HystrixCommand注解
3、全局服務降級
4、通配服務降級FeignFallback
使用方式:實現Feign接口並交由Spring容器管理,@FeignClient注解添加Fallback屬性
三、服務熔斷
1、代碼實現
HystrixCommandProperties查看配置
2、測試及分析
分析:
(1)斷路器在什么情況下開始起作用?
涉及到斷路器的三個重要參數:快照時間窗、請求總數閾值、錯誤百分比閾值
1、快照時間窗:斷路器確定是否打開需要統計一些請求和錯誤數據,而統計的時間范圍就是快照時間窗,默認為最近的10秒。
2、請求總數閾值:在快照時間窗內,必須滿足請求總數閾值才有資格熔斷。默認為20,意味着在10秒內,如果該Hystrix命令的調動次數不足20次,即使所有的請求都超時或其他原因失敗,斷路器都不會打開。
3、錯誤百分比閾值:當請求總數在快照時間窗內超過了閾值,比如發生了30次調用,如果在這30次調用中,有15次調用發生了超時異常,也就是超過了50%的錯誤百分比,在默認設定50%閾值的情況下,這時候斷路器就會打開。
(2)斷路器開啟或關閉的條件?
1、當滿足一定閾值時(默認10秒內超過20個請求次數)
2、當失敗率達到一定時(默認10秒內超過50%的請求失敗)
3、到達以上閾值,斷路器將開啟
4、當開啟時,所有請求將不會轉發
5、一段時間后(默認是5秒),這個時候斷路器是半開狀態,會讓其中一個進行轉發。如果成功,斷路器會關閉,若失敗,繼續開啟。重復4~5
(3)斷路器開啟后:
1、再有請求調用的時候,將不會調用主邏輯,而是直接調用降級fallback,通過斷路器,實現了自動地發現錯誤並將降級邏輯切換為主邏輯,減少響應延遲的效果。
2、原來的主邏輯要如何恢復?
①Hystrix實現了自我恢復的功能
②當斷路器打開時,Hystrix會啟動一個休眠時間窗,在這個時間窗內,降級邏輯是臨時的主邏輯
③當休眠時間窗到期,斷路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那么斷路器將閉合,主邏輯恢復;否則繼續打開狀態,休眠時間窗重新計時。
四、Hystrix圖形化DashBoard監控
參考鄙人博客:SpringCloud全家桶學習之斷路器---Hystrix(五),Cloud升級后有坑
1、被監控的服務添加如下代碼
否則會出現:Unable to connect to Command Metric Stream

/** * 此配置是為了服務監控而配置,與服務容錯本身無觀,springCloud 升級之后的坑 * ServletRegistrationBean因為springboot的默認路徑不是/hystrix.stream * 只要在自己的項目中配置上下面的servlet即可 * * @return */ @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean<HystrixMetricsStreamServlet> registrationBean = new ServletRegistrationBean<>(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
2、DashBoard Web界面
簡記:7色,1圈,1線
7個顏色分別對應有英文提示說明;
1圈越大,說明該服務的訪問頻率越高,流量壓力也比較大;
1線就很明顯了,實時的調用頻率。
說明:
①實心圓:兩層含義,它通過顏色的變化代表了實例的健康程度,它的健康程度從綠色<黃色<橙色<紅色依次遞減。此外,它的大小也會根據實例的請求流量發生變化,流量越大該實心圓就越大。所以通過實心圓的展示,就可以在大量的實例中快速的發現故障實例和高壓力實例。
②曲線:用來記錄2分鍾內的相對變化,可以通過它來觀察到流量的上升和下降趨勢