Spring Cloud zuul自定义统一异常处理实现方法

所属分类: 软件编程 / java 阅读数: 28
收藏 0 赞 0 分享

Zuul在springcloud微服务体系中提供filer和router功能,是微服务不可或缺的部分。filer处理默认实现的外还可以自定义进行授权、限流、安全校验等,router完全可以替代Nginx反向代理。Zuul异常处理就是由SendErrorFilter完成。

在我们应用过程我们发现使用默认的异常filter有两个问题不是很友好:

1.无法快速识别出是否是请求路由的服务超时还是没有任何可用节点,发生错误只能查看日志通过堆栈去定位;

2.无法兼容自定义的譬如{code:500,msg:”xx error”}格式的响应包格式。

接下来我们讨论的是如何自定义异常处理、自定义异常提示信息等。

首先,我们必须禁用默认的SendErrorFilter,官方已经提供了开关配置,直接配置即可

zuul.SendErrorFilter.post.disable=true

自定义ErrorFilter,这里就不多说,直接贴代码

public class ErrorFilter extends ZuulFilter {
  private static final String ERROR_STATUS_CODE_KEY = "error.status_code";
  private Logger log = LoggerFactory.getLogger(ErrorFilter.class);
  public static final String DEFAULT_ERR_MSG = "系统繁忙,请稍后再试";
  @Override
  public String filterType() {
    return "post";
  }
  @Override
  public int filterOrder() {
    return 0;
  }
  @Override
  public boolean shouldFilter() {
    RequestContext ctx = RequestContext.getCurrentContext();
    return ctx.containsKey(ERROR_STATUS_CODE_KEY);
  }
  @Override
  public Object run() {    
    RequestContext ctx = RequestContext.getCurrentContext();
    try {
      HttpServletRequest request = ctx.getRequest();
      int statusCode = (Integer) ctx.get(ERROR_STATUS_CODE_KEY);
      String message = (String) ctx.get("error.message");
      if (ctx.containsKey("error.exception")) {
        Throwable e = (Exception) ctx.get("error.exception");
        Throwable re = getOriginException(e);
        if(re instanceof java.net.ConnectException){
          message = "Real Service Connection refused";
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else if(re instanceof java.net.SocketTimeoutException){
          message = "Real Service Timeout";
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else if(re instanceof com.netflix.client.ClientException){
          message = re.getMessage();
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else{
          log.warn("Error during filtering",e);
        }
      }
      if(StringUtils.isBlank(message))message = DEFAULT_ERR_MSG;
      request.setAttribute("javax.servlet.error.status_code", statusCode);
      request.setAttribute("javax.servlet.error.message", message);
      WebUtils.responseOutJson(ctx.getResponse(), JsonUtils.toJson(new WrapperResponse<>(statusCode, message)));
    } catch (Exception e) {
      String error = "Error during filtering[ErrorFilter]";
      log.error(error,e);
      WebUtils.responseOutJson(ctx.getResponse(), JsonUtils.toJson(new WrapperResponse<>(500, error)));
    }
    return null;
  }
  private Throwable getOriginException(Throwable e){
    e = e.getCause();
    while(e.getCause() != null){
      e = e.getCause();
    }
    return e;
  }
}

最后注册我们自定义的ErrorFilter

@Bean 
public ErrorFilter errorFilter(){
  return new ErrorFilter();
}

以上所述是小编给大家介绍的Spring Cloud zuul自定义统一异常处理实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

Java基础之反射原理与用法详解

这篇文章主要介绍了Java基础之反射原理与用法,结合实例形式详细分析了java反射的相关概念、原理、使用方法与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

java字符串的截取方法substring()代码解析

这篇文章主要介绍了java字符串的截取方法substring()代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Mybatis一对多关联关系映射实现过程解析

这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java整数和字符串相互转化实例详解

这篇文章主要介绍了Java整数和字符串相互转化实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot 项目设置网站图标的方法

这篇文章主要介绍了Spring Boot 项目设置网站图标的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java多态机制原理特点详解

在本篇文章里小编给大家分享的是关于java多态机制原理特点详解,有需要的朋友们可以跟着学习下。
收藏 0 赞 0 分享

Jmeter如何添加循环控制器

这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java虚拟机创建失败的原因整理

在本篇文章里小编给大家整理了关于创建java虚拟机失败的解决方法和知识点,需要的朋友们可以参考学习下。
收藏 0 赞 0 分享

Java如何把int类型转换成byte

这篇文章主要介绍了Java如何把int类型转换成byte,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

linux中java获取路径的实例代码

在本篇文章里小编给大家整理的是一篇关于linux中java获取路径的实例代码以及相关知识点,有兴趣的朋友们可以学习参考下。
收藏 0 赞 0 分享
查看更多