spring cloud優雅的處理feign熔斷異常

大雄45發表於2021-03-13
導讀 在微服務中,我們透過feign來呼叫其他微服務的功能,我們可以新增熔斷來避免雪崩,因為我們熔斷的目的是為了快速返回給呼叫方,避免雪崩;實際上,我們一般不寫熔斷回撥方法,直接捕獲異常,返回適當異常資訊給使用者即可。

spring cloud優雅的處理feign熔斷異常spring cloud優雅的處理feign熔斷異常

1、實現
1-1、配置

增加以下配置,feign開啟熔斷後,遠端服務的異常會被消化,而走熔斷方法;所以,需要以下配置配置來關閉熔斷,好統一捕獲服務異常;

# feign配置
feign.hystrix.enabled=false
1-2、捕獲異常並處理

捕獲feign異常有兩種方法,一種是在呼叫處 try...catch...;一種是統一捕獲處理,推薦後者;

統一捕獲:增加一個配置類,實現ErrorDecoder介面,在裡面就可以捕獲feign異常並上拋自定義異常了;

然後,在我們之前寫的統一異常處理的就可以捕獲和處理這個異常,並返回友好的資訊給使用者了;

@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);
            }
        }
    }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2762742/,如需轉載,請註明出處,否則將追究法律責任。

相關文章