zoukankan      html  css  js  c++  java
  • 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异常了;

  • 相关阅读:
    【面试】代码默写-DCL单例
    【状态机】SCXML2
    【面试】JVM
    【面试】HashMap
    读取resource下sql脚本并执行
    Maven 二进制资源文件(excel pdf...)部署出错,乱码的解决方案
    【JVM】java内存模型
    【Spring】源码二、IOC
    mapstruct 高级用法
    warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 6.0, but the range of supported deployment target versions is 8.0 to 13.2.99.
  • 原文地址:https://www.cnblogs.com/yanghj/p/13686989.html
Copyright © 2011-2022 走看看