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

所属分类: 软件编程 / java 阅读数: 39
收藏 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实现背单词程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java实现单词查询小程序

这篇文章主要为大家详细介绍了java实现单词查询小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java程序开发环境配置图文教程

这篇文章主要为大家详细介绍了Java程序开发环境配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解ssh框架原理及流程

在本文中小编给大家整理的是关于ssh框架原理及流程的相关知识点内容,有此需要的朋友们可以学习下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解springmvc常用5种注解

在本篇里我们给大家总结了关于springmvc常用5种注解相关知识点以及实例代码,需要的朋友们参考下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作(2)

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Spring Boot假死诊断实战记录

这篇文章主要给大家介绍了关于Spring Boot假死诊断的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java计时新姿势StopWatch详解

这篇文章主要介绍了Java计时新姿势StopWatch,最近公司来了个大佬,从他那里学到不少东西,其中一个就是计时的新姿势「StopWatch」,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现点击按钮弹出新窗体功能

这篇文章主要为大家详细介绍了java实现点击按钮弹出新窗体功能,旧窗体不进行操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多