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

 更新时间:2018年02月02日 16:46:45   投稿:mrr  
这篇文章主要介绍了Spring Cloud zuul自定义统一异常处理实现,需要的朋友可以参考下

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连接sftp服务器实现上传下载功能

    Java连接sftp服务器实现上传下载功能

    这篇文章主要介绍了java连接sftp服务器实现上传下载,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java实现赫夫曼树(哈夫曼树)的创建

    Java实现赫夫曼树(哈夫曼树)的创建

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。这篇文章主要就是为大家介绍如何通过Java实现赫夫曼树,需要的朋友可以参考一下
    2021-12-12
  • 启动SpringBoot报错Input length = 1问题及解决

    启动SpringBoot报错Input length = 1问题及解决

    这篇文章主要介绍了启动SpringBoot报错Input length = 1问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SpringBoot中使用@Value注解注入详解

    SpringBoot中使用@Value注解注入详解

    这篇文章主要介绍了SpringBoot中的@Value注入详解,在SpringBoot中,@Value注解可以注入一些字段的普通属性,并且会自动进行类型转换,本文对这些类型进行总结,需要的朋友可以参考下
    2023-08-08
  • Spring Cloud之服务监控turbine的示例

    Spring Cloud之服务监控turbine的示例

    这篇文章主要介绍了Spring Cloud之服务监控turbine的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Spring Boot接口设计防篡改、防重放攻击详解

    Spring Boot接口设计防篡改、防重放攻击详解

    这篇文章主要给大家介绍了关于Spring Boot接口设计防篡改、防重放攻击的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • SpringCloudGateway Nacos GitlabRunner全自动灰度服务搭建发布

    SpringCloudGateway Nacos GitlabRunner全自动灰度服务搭建发布

    这篇文章主要为大家介绍了SpringCloudGateway Nacos GitlabRunner全自动灰度服务搭建和发布实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题

    如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题

    这篇文章主要介绍了如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 一文探索Java文件读写更高效方式

    一文探索Java文件读写更高效方式

    这篇文章主要介绍了一文探索Java文件读写更高效方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-07-07

最新评论