0-前言
在微服務中,我們通過feign來調用其他微服務的功能,我們可以添加熔斷來避免雪崩,比如本系列前面(四)介紹的方法:
@FeignClient(name = "user",configuration = FeignConfig.class,fallback = FUserServiceHystrix.class),
但是,每個feign調用的方法都寫一個熔斷回調方法,其實是沒必要的,也大量冗余代碼;
因為我們熔斷的目的是為了快速返回給調用方,避免雪崩;
實際上,我們一般不寫熔斷回調方法,直接捕獲異常,返回適當異常信息給用戶即可;
1-實現
1-1、配置
增加以下配置,feign開啟熔斷后,遠端服務的異常會被消化,而走熔斷方法;所以,需要以下配置配置來關閉熔斷,好統一捕獲服務異常;
# feign配置 feign.hystrix.enabled=false
1-2、捕獲異常並處理
捕獲feign異常有兩種方法,一種是在調用處 try...catch...;一種是統一捕獲處理,推薦后者;
統一捕獲:增加一個配置類,實現ErrorDecoder接口,在里面就可以捕獲feign異常並上拋自定義異常了;
然后,在我們之前寫的統一異常處理的就可以捕獲和處理這個異常,並返回友好的信息給用戶了;
關於統一異常處理,參考前面的:小白的springboot之路(十)、全局異常處理
@Configuration public class FeignErrorDecoder implements ErrorDecoder { public static final Logger log = LoggerFactory.getLogger(FeignErrorDecoder.class); @Override public Exception decode(String methodKey, Response response) { try { // 獲取異常信息 String message = Util.toString(response.body().asReader()); JSONObject jsonObject = JSONObject.parseObject(message); log.error(message); //記錄日志 //直接上拋自定義異常 // return new BizException(jsonObject.getInteger("code"), jsonObject.getString("msg")); return new BizException(jsonObject.getInteger("resultCode"), jsonObject.getString("resultMsg")); } catch (Exception ex) { //1、調用參數異常 if (response.status() >= 400 && response.status() <= 500) { return new BizException(ResultCode.INVALID_REQUEST); } else { return new BizException(ResultCode.INTERNAL_SERVER_ERROR); } } } }
2-總結
feign熔斷異常處理就這么簡單,我們不需要再寫任何一個熔斷方法,就可以優雅的統一捕獲並處理feign異常了;