使用feign调用其他服务发现需要自定义ErrorCode,因为不是所有的情况都需要熔断,自定义的ErrorCode中可以根据错误码来自定义返回异常:
@Configuration public class MyErrorDecoder extends ErrorDecoder.Default { @Override public Exception decode(String s, Response response) { if(response.status() == 401){ return new BusinessException("请求"+s+"服务"+ErrorCodeEnum.TOKEN_ERROR); } if(response.status() == 404){ return new BusinessException("请求"+s+"服务404异常"); } return new BusinessException("请求"+s+"服务"+ErrorCodeEnum.FEIGN_ERROR_FALLBACK); } }
这种形式发现自定义的BusinessException无法进入自定义的统一异常返回,原来需要返回HystrixBadRequestException,这个异常可以让其不进入熔断直接返回:
if (response.status() == 401) { return new HystrixBadRequestException("请求" + s + "服务401异常",new BusinessException(ErrorCodeEnum.TOKEN_ERROR)); } if (response.status() == 404) { return new HystrixBadRequestException("请求" + s + "服务404异常",new BusinessException(ErrorCodeEnum.FEIGN_ERROR_FALLBACK)); } return new BusinessException("请求" + s + "服务异常");