Springcloud學習筆記-服務容錯-Hystrix
阿新 • • 發佈:2020-12-08
技術標籤:Spring Cloudjavaspringspring cloud
文章目錄
Hystrix體系架構和核心功能解析
Hystrix核心功能主要為服務降級、服務熔斷、執行緒隔離。
- 服務降級:當Hystrix呼叫目標請求發生異常時,這時候hystrix會自動把這個請求轉發到降級邏輯中,降級邏輯是由服務呼叫方來編寫異常處理邏輯。
- 服務熔斷:服務熔斷是建立在服務降級之上的一個異常處理措施。服務降級需要等待HTTP請求從服務節點返回異常或超時,再轉發到fallback邏輯。但服務熔斷引入了一個叫“斷路器/熔斷器”的機制,當熔斷器開啟時,對服務的呼叫將不再發送至目標服務節點,直接轉向fallback邏輯。
- 執行緒隔離:Hystrix的執行緒隔離方案可以將執行服務呼叫的程式碼和容器本身的執行緒池進行隔離,可以配置每個服務所需執行緒的最大數量,這樣即使一個服務執行緒池被吃滿也不會影響其他服務。
服務降級
服務降級常用方案
- 靜默處理:在fallback邏輯中直接返回一個null。
- 預設值:在不確定真實結果的情況下返回一個預設值。
- 在降級邏輯中想辦法恢復服務:如快取異常可以轉而訪問資料庫。切換備庫,重試,人工干預。
- 多次降級:在fallback邏輯裡如果又發生異常可以再次降級。
服務降級實現程式碼
第一種是在方法上加@HystrixCommand(fallbackMethod = “myFallback”),當服務出現異常時會執行myFallback方法中的邏輯。
@HystrixCommand(fallbackMethod = "myFallback")
public String error(){
throw new RuntimeException("服務丟擲異常!!!");
}
第二種是在FeignClient註解中指定一個class,在這個類裡可以處理Feign介面中宣告的所有方法的降級需求。
@FeignClient(name = "feign-client",fallback = MyFallBack.class) public interface MyService extends IService{ }
Request Cache減壓
@CacheResult註解的意思是該方法的結果可以被Hystrix快取起來,@CacheKey指定了根據哪個key來快取結果。在一個Hystrix上下文中,如果使用相同引數對@CacheResult修飾的方法進行多次呼叫,hystrix只會首次呼叫的時候像服務節點發生請求,後幾次都是從Hystrix的本地快取裡讀取資料。
@CacheResult
@HystrixCommand(commandKey = "cacheKey") //方法級降級引數
public Demo requestCache(@CacheKey String name){
log.info("開始請求requestCache,name={}",name);
Demo demo = new Demo();
demo.setName(name);
demo = service.sayHi(demo);
log.info("結束請求requestCache,name={}",name);
return demo;
}
多級降級
如果在降級邏輯中出現異常可以進行再一次降級。
/**
* @author lank
* @since 2020/12/6 16:40
* 降級邏輯方法
*/
@Slf4j
@Component
public class MyFallBack implements MyService {
@HystrixCommand(fallbackMethod = "error2")
public String error() {
log.info("hystrix 進行降級流程!");
//return "已經呼叫降級流程";
throw new RuntimeException("第一次降級!");
}
@HystrixCommand(fallbackMethod = "error3")
public String error2(){
log.info("hystrix 進行降級流程!222");
throw new RuntimeException("第二次降級!");
}
public String error3(){
return "成功!";
}
public String sayHi() {
return null;
}
public Demo sayHi(Demo demo) {
return null;
}
public String retry(Integer timeout) {
return "你已經超時了!!!";
}
}
超時降級配置
- Hystrix預設全域性超時配置
#全域性超時時間
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
- Hystrix方法級別超時配置該配置是基於方法簽名的,MyService下的引數為Integer的retry方法。可以使用Feign.configKey(MyService.class,MyService.class.getMethod(“retry”, Integer.class))獲取。
hystrix.command.MyService#retry(Integer).execution.isolation.thread.timeoutInMilliseconds=3000
- 基於CommandKey的配置
方法級別註解
@HystrixCommand(commandKey = "cacheKey",fallbackMethod="fallback")
配置檔案
hystrix.command.MyService#retry(Integer).execution.isolation.thread.timeoutInMilliseconds=5000
服務熔斷
熔斷器有三個狀態:
- 熔斷器open狀態,該狀態時服務在一定的時間內不會發起外部呼叫,而是直接轉向fallback裡。
- 熔斷器half-open狀態,會嘗試發起一次真實的服務呼叫
- 熔斷器closed,上一步呼叫成功,關閉熔斷器,以後服務正常呼叫。
熔斷器的判斷閾值
- 在一定時間內,發生異常的請求數量達到臨界值。
- 在一定時間內,發生異常的請求數量佔請求總數量達到一定比例。
#==================熔斷器配置
#熔斷的前提條件(請求的數量),在一定的時間視窗內,請求打到5個後,才進行熔斷判斷
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
#超過50%的失敗請求,則熔斷開啟
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
#當熔斷開啟後,經過多少秒再進入半開狀態
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=15000
#配置時間視窗
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=20000
相關程式碼GitHub:https://github.com/lank-java/springcloud