Hystrix 服務熔斷 與 服務限流


服務熔斷

熔斷機制概述

熔斷機制是應對雪崩效應的一種微服務鏈路保護機制,當扇出鏈路的某個微服務出錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息。當檢測到該節點微服務調用響應正常后,恢復調用鏈路。

在spring-cloud框架里,熔斷機制通過Hystrix實現。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,缺省是5秒內20次調用失敗,就會啟動熔斷機制,熔斷機制的注解是@HystrixCommand

@HystrixCommand(fallbackMethod = "paymentCircuiBreaker_fallback",commandProperties = {
@HystrixProperty(name="circuitBreaker.enabled",value = "true"),//是否開啟斷路器
@HystrixProperty(name="circuitBreaker.requestVolumentThreshold",value = "10"),//請求次數
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//時間窗口期
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60")//失敗率達到多少后跳閘
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
if(id<0){
throw new RuntimeException("****id 不能負數");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName()+"\t"+"調用成功,流水號:"+serialNumber;
}
public String paymentCircuiBreaker_fallback(@PathVariable("id") Integer id){
return "id 不能為負數,請稍后再試,/(ㄒoㄒ)/~~ id:"+id;
}

 在controller中添加調用方法

//===服務熔斷
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
String result = paymentService.paymentCircuitBreaker(id);
log.info("result:"+result);
return result;
}

測試:

依次啟動7001、8001

 

自身測試:

 

 

 

 

 斷路器測試:

多次請求負數調用,次數超過10次,而且錯誤率大於60%,然后再突然正數請求,但你發現再某一瞬間正數請求也不好使了,這個時候是斷路器熔斷了,然后再過一會隨着正確率上升慢慢恢復鏈路。

總結

熔斷類型:

1.熔斷打開

請求不再進行調用當前服務,內部設置時鍾一般為MTTR(平均故障處理時間),當打開時長達到所設時鍾則進入半熔斷狀態

2.熔斷關閉

熔斷關閉不會對服務進行熔斷

3.熔斷半開

部分請求根據規則調用當前服務,如果請求成功且符合規則則認為當前服務恢復正常,關閉熔斷

 

  斷路器打開之后:

1.再有請求調用的時候,將不會調用主邏輯,而是直接調用降級fallback。通過斷路器,實現了自動地發現錯誤並將降級邏輯切換為主邏輯,減少影響延遲的效果。

2.原來的主邏輯如何恢復呢?

對於這個問題,Hystrix也為我們實現了自動恢復功能。

當斷路器打開,對主邏輯進行熔斷之后,hystrix回啟動一個休眠時間窗,在這個事件窗內,降級邏輯是臨時的成為主邏輯,當休眠時間窗到期,斷路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那么斷路器將繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器繼續進入打開狀態,休眠時間窗重新計時。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM