服務熔斷
熔斷機制概述
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制,當扇出鏈路的某個微服務出錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息。當檢測到該節點微服務調用響應正常后,恢復調用鏈路。
在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回啟動一個休眠時間窗,在這個事件窗內,降級邏輯是臨時的成為主邏輯,當休眠時間窗到期,斷路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那么斷路器將繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器繼續進入打開狀態,休眠時間窗重新計時。