spring cloud微服務快速教程之(十三) 優雅的處理feign熔斷異常


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異常了;


免責聲明!

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



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