返回顶部
首页 > 资讯 > 精选 >Spring Cloud Zuul中异常处理细节有哪些
  • 317
分享到

Spring Cloud Zuul中异常处理细节有哪些

2023-06-19 12:06:13 317人浏览 泡泡鱼
摘要

本篇内容主要讲解“spring cloud Zuul中异常处理细节有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring Cloud Zuul中异常处理细节有哪些”吧!首先我们来看一张

本篇内容主要讲解“spring cloud Zuul中异常处理细节有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习spring Cloud Zuul中异常处理细节有哪些”吧!

首先我们来看一张官方给出的Zuul请求的生命周期图,如下:

Spring Cloud Zuul中异常处理细节有哪些  

关于这张图我说如下几点:

正常情况下所有的请求都是按照pre、route、post的顺序来执行,然后由post返回response
2.在pre阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post的任意一个阶段如果抛异常了,则执行error过滤器,然后再执行post给出响应

这是这张图给我们的信息,我们再来看看源码com.netflix.zuul.Http.ZuulServlet类中的service方法,这是整个调用过程的核心,如下:

try {    init((httpservletRequest) servletRequest, (HttpServletResponse) servletResponse);    // Marks this request as having passed through the "Zuul engine", as opposed to servlets    // explicitly bound in WEB.xml, for which requests will not have the same data attached    RequestContext context = RequestContext.getCurrentContext();    context.setZuulEngineRan();    try {        preRoute();    } catch (ZuulException e) {        error(e);        postRoute();        return;    }    try {        route();    } catch (ZuulException e) {        error(e);        postRoute();        return;    }    try {        postRoute();    } catch (ZuulException e) {        error(e);        return;    }} catch (Throwable e) {    error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));} finally {    RequestContext.getCurrentContext().unset();}

我们看到这里有一个大的try…catch,大的try…catch里边有三个小的try…catch,小的try…catch只负责捕获ZuulException异常,其他的异常交给大的try…catch来捕获。pre和route执行出错之后都会先执行error再执行post,而post执行出错之后就只执行error而不会再执行post。

ZuulFilter最终会在com.netflix.zuul.FilterProcessor的processZuulFilter方法中被调用,在该方法中会判断runFilter是否执行成功,如果执行失败,则将异常信息提取出来,然后抛出异常,抛出的异常如果是ZuulException的实例,则抛出一个ZuulException类型的异常,如果不是ZuulException的实例,则抛出一个状态码为500的ZuulException类型的异常,所以无论如何,我们最终看到的都是ZuulException类型的异常,下面我贴出processZuulFilter方法的一部分核心代码,如下:

public Object processZuulFilter(ZuulFilter filter) throws ZuulException {    try {        ZuulFilterResult result = filter.runFilter();        ExecutionStatus s = result.getStatus();        execTime = System.currentTimeMillis() - ltime;        switch (s) {            case FaiLED:                t = result.getException();                ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);                break;            case SUCCESS:                break;            default:                break;        }        if (t != null) throw t;        usageNotifier.notify(filter, s);        return o;    } catch (Throwable e) {        usageNotifier.notify(filter, ExecutionStatus.FAILED);        if (e instanceof ZuulException) {            throw (ZuulException) e;        } else {            ZuulException ex = new ZuulException(e, "Filter threw Exception", 500, filter.filterType() + ":" + filterName);            ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);            throw ex;        }    }}

在Zuul中,所有的错误问题的最终都是被SendErrorFilter类来处理,该类在早期的版本是一个post类型的filter,post类型的filter有一个缺陷就是不能处理post中抛出的异常,需要我们手动去完善,而我目前使用的这个版本(Dalston.SR3)已经修复了这个问题,SendErrorFilter现在是一个error类型的filter,而且只要RequestContext中有异常就会进入到SendErrorFilter中,错误信息也都从exception对象中提取出来,核心代码如下:

@Overridepublic boolean shouldFilter() {    RequestContext ctx = RequestContext.getCurrentContext();    // only forward to errorPath if it hasn't been forwarded to already    return ctx.getThrowable() != null            && !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false);}@Overridepublic Object run() {    try {        RequestContext ctx = RequestContext.getCurrentContext();        ZuulException exception = findZuulException(ctx.getThrowable());        HttpServletRequest request = ctx.getRequest();        request.setAttribute("javax.servlet.error.status_code", exception.nStatusCode);        log.warn("Error during filtering", exception);        request.setAttribute("javax.servlet.error.exception", exception);        if (StringUtils.hasText(exception.errorCause)) {            request.setAttribute("javax.servlet.error.message", exception.errorCause);        }        RequestDispatcher dispatcher = request.getRequestDispatcher(                this.errorPath);        if (dispatcher != null) {            ctx.set(SEND_ERROR_FILTER_RAN, true);            if (!ctx.getResponse().isCommitted()) {                dispatcher.forward(request, ctx.getResponse());            }        }    }    catch (Exception ex) {        ReflectionUtils.rethrowRuntimeException(ex);    }    return null;}

如果我们想要自定义异常信息也很方便,如下:

@Componentpublic class MyErrorAttribute extends DefaultErrorAttributes {    @Override    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {        Map<String, Object> result = super.getErrorAttributes(requestAttributes, includeStackTrace);        result.put("status", 222);        result.put("error", "error");        result.put("exception", "exception");        result.put("message", "message");        return result;    }}

到此,相信大家对“Spring Cloud Zuul中异常处理细节有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Spring Cloud Zuul中异常处理细节有哪些

本文链接: https://lsjlt.com/news/296086.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Cloud Zuul中异常处理细节有哪些
    本篇内容主要讲解“Spring Cloud Zuul中异常处理细节有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Zuul中异常处理细节有哪些”吧!首先我们来看一张...
    99+
    2023-06-19
  • Spring Cloud Stream的使用细节有哪些
    Spring Cloud Stream的使用细节有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。上我们就来看看Spring Cloud Stream的一些使用细节。自定义消...
    99+
    2023-06-19
  • spring处理异常的方法有哪些
    Spring提供了多种处理异常的方法,包括:1. 使用@ControllerAdvice注解的类:可以全局捕获和处理Controll...
    99+
    2023-08-18
    Spring
  • Spring Cloud常见问题有哪些
    本篇内容介绍了“Spring Cloud常见问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Eureka常见问题Eureka 注...
    99+
    2023-06-05
  • Spring Cloud中有哪些组件
    这篇文章主要介绍了Spring Cloud中有哪些组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring Cloud七大组件:1、Eureka组件,描述了服务如何进行...
    99+
    2023-06-14
  • python中有哪些异常处理技巧
    这篇文章给大家介绍python中有哪些异常处理技巧,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自...
    99+
    2023-06-14
  • Python中有哪些异常处理机制
    Python中有哪些异常处理机制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。>>>>>>   ...
    99+
    2023-06-17
  • Python中异常处理用法有哪些
    本篇内容主要讲解“Python中异常处理用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中异常处理用法有哪些”吧!为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,...
    99+
    2023-06-21
  • Java中异常处理误区有哪些
    这篇文章将为大家详细讲解有关Java中异常处理误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。误区一、异常的选择图 1. 异常分类图 1 描述了异常的结构,其实我们都知道异常分检测异常和非检测异常...
    99+
    2023-05-30
    java
  • 有哪些前端异常处理
    这篇文章主要讲解了“有哪些前端异常处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些前端异常处理”吧!什么是异常用直白的话来解释异常的话,就是程序发生...
    99+
    2024-04-02
  • Spring Cloud Gateway Hystrix fallback获取异常信息的处理
    Gateway Hystrix fallback获取异常信息 gateway fallback后,需要知道请求的是哪个接口以及具体的异常信息,根据不同的请求以及异常进行不同的处理。一...
    99+
    2024-04-02
  • php中的异常处理函数有哪些
    php中的异常处理函数有set_exception_handler函数set_exception_handler函数作用:php中set_exception_handler函数的作用是用于创建运行期间的用户自己的异常处理方法。set_exc...
    99+
    2024-04-02
  • python中异常处理的过程有哪些
    这篇文章将为大家详细讲解有关python中异常处理的过程有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向...
    99+
    2023-06-14
  • python中有哪些异常处理关键字
    这篇文章给大家介绍python中有哪些异常处理关键字,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么...
    99+
    2023-06-14
  • python中异常处理的作用有哪些
    Python中的异常处理有以下作用:1. 防止程序因为错误而崩溃:异常处理可以捕获程序运行中出现的错误,并采取相应的措施来避免程序崩...
    99+
    2023-09-06
    python
  • Python中的异常处理技巧有哪些?
    Python中的异常处理技巧有哪些?需要具体代码示例Python是一种易于学习和使用的编程语言,它提供了强大的异常处理机制,可以帮助程序员增强代码的可靠性和可维护性。在编写Python程序时,我们经常会遇到各种各样的异常情况,如文件读写错误...
    99+
    2023-10-22
    Python 技巧 异常处理
  • python异常处理结构有哪些
    python中常见的异常处理结构有以下几种try…except结构except语句中可以通过调用异常处理器对异常进行处理,从而继续往下执行程序。try…except结构使用方法:s = 'Hello girl!'try:print s[10...
    99+
    2024-04-02
  • redis异常处理方法有哪些
    在Redis中,可以通过以下几种方式处理异常:1. 异常捕获:在Redis操作过程中,可以使用try-catch语句来捕获异常,并在...
    99+
    2023-09-16
    redis
  • C++ 函数异常处理中常见陷阱有哪些?
    c++++ 函数异常处理中常见的陷阱:避免在异常处理块中返回局部变量引用或指针,以免指向无效内存。异常处理块中不要重复抛出异常,以免覆盖原始异常信息。谨慎使用 noexcept 指定符,...
    99+
    2024-04-24
    c++ 异常处理
  • Java中异常处理的关键字有哪些
    Java中的异常处理关键字有以下几个: try:用于标识要捕获异常的代码块。 catch:用于捕获指定类型的异常,并在捕获到...
    99+
    2024-02-29
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作