1.背景

错误信息:

-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

com.netflix.zuul.exception.ZuulException: Forwarding error
        at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:183)
        at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:158)
        at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:106)
        at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112)
        at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193)
        at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157)
        at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118)
        at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96)
        at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116)
        at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81)
        at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:157)
        at org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequest(ZuulController.java:44)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.cloud.sleuth.instrument.web.TraceFilter.doFilter(TraceFilter.java:169)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
2018-01-18 09:48:18.852 ERROR [api-gateway,5047c7e7b4449179,aa1e88c3768befe6,true] 1 --- [http-nio-9904-exec-5] c.r.k.api.gateway.filter.AccessFilter    : 错误信息:{timestamp=Thu Jan 18 09:48:18 UTC 2018, status=500, error=Internal Server Error, exception=com.netflix.zuul.exception.ZuulException, message=GENERAL}
2018-01-18 09:48:18.855  INFO [服务名,5047c7e7b4449179,5047c7e7b4449179,true] 1 --- [http-nio-9904-exec-5] c.r.k.api.gateway.filter.ResponseFilter  : 请求耗时:5016毫秒

2.场景分析

根据日志信息进行回溯问题的发生点;

at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:183)根据 这段日志我们找到如下源码:

package org.springframework.cloud.netflix.zuul.filters.route
public class RibbonRoutingFilter extends ZuulFilter
protected ClientHttpResponse handleException(Map<String, Object> info,HystrixRuntimeException ex) throws ZuulException {int statusCode = HttpStatus.INTERNAL_SERVER_ERROR.value();Throwable cause = ex;String message = ex.getFailureType().toString();ClientException clientException = findClientException(ex);if (clientException == null) {clientException = findClientException(ex.getFallbackException());}if (clientException != null) {if (clientException.getErrorType() == ClientException.ErrorType.SERVER_THROTTLED) {statusCode = HttpStatus.SERVICE_UNAVAILABLE.value();}cause = clientException;message = clientException.getErrorType().toString();}info.put("status", String.valueOf(statusCode));throw new ZuulException(cause, "Forwarding error", statusCode, message);
}

分析如上函数handleException(... ...)执行逻辑;重点是最后一行代码,throw new ZuulException(cause,"Forwarding error",statusCode,message);接下来我们逐个分析各个变量是如何被赋值的;

1) 其中变量statusCode赋值有两种情况,一种为初始被赋值为HttpStatus.INTERNAL_SERVER_ERROR.value()(值:500);另一种情况被赋值为HttpStatus.SERVICE_UNAVAILABLE.value()(值:503);

HttpStatus.INTERNAL_SERVER_ERROR.value()
/*** {@code 500 Internal Server Error}.* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.1">HTTP/1.1: Semantics and Content, section 6.6.1</a>*/
INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
HttpStatus.SERVICE_UNAVAILABLE.value()
/*** {@code 503 Service Unavailable}.* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.4">HTTP/1.1: Semantics and Content, section 6.6.4</a>*/
SERVICE_UNAVAILABLE(503, "Service Unavailable"),

由于最终new ZuulExceptioin的statusCode为500,所以可以排除SERVER_UNAVAILABLE的情况;

2) 变量message的赋值也有两种情况:一种如初始赋值String message = ex.getFailureType().toString();(HystrixRuntimeException);另一种是message = clientException.getErrorType().toString();(ClientException);

下面分别为HystrixRuntimeException 的FailureType的类型信息,ClientException的ErrorType类型信息:

public static enum FailureType {BAD_REQUEST_EXCEPTION, COMMAND_EXCEPTION, TIMEOUT, SHORTCIRCUIT, REJECTED_THREAD_EXECUTION, REJECTED_SEMAPHORE_EXECUTION, REJECTED_SEMAPHORE_FALLBACK
}
/*** define your error codes here* */public enum ErrorType{GENERAL, CONFIGURATION, NUMBEROF_RETRIES_EXEEDED, NUMBEROF_RETRIES_NEXTSERVER_EXCEEDED, SOCKET_TIMEOUT_EXCEPTION, READ_TIMEOUT_EXCEPTION,UNKNOWN_HOST_EXCEPTION,CONNECT_EXCEPTION,CLIENT_THROTTLED,SERVER_THROTTLED,NO_ROUTE_TO_HOST_EXCEPTION,CACHE_MISSING;static String getName(int errorCode){if (ErrorType.values().length >= errorCode){return ErrorType.values()[errorCode].name();}else{return "UNKNOWN ERROR CODE";}}}

而最终message=GENERAL ,排除了初始赋值,异常由ClientException产生;

解决思路:

关于上面

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL相关推荐

  1. Spring Cloud 系列之 Netflix Zuul 服务网关(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Netflix Zuul 服务网关(一) Spring Cloud 系列之 Netflix Zuul 服务网关(二) ...

  2. 基于微服务spring cloud+vue+spring boot在线聊天交友软件的设计与实现

    针对企业和机构在聊天通讯软件中的的信息管理监控困难.系统稳定性不足.二次开发困难.部署运维困难问题,对一个自主可控,安全稳定的通讯系统进行分析设计. 采用前后端分离的开发模式,前端基于WEB端,采用基 ...

  3. 微服务Spring Cloud

    Java服务器项目分类 现在市面上常见的java开发的项目可以分为两大类 1.企业级应用 一般指一个企业或机构内部使用的网站或服务器应用程序 包括的领域很多,包括并不限于:商业,企事业单位,医疗,军事 ...

  4. 消息驱动 微服务器,消息驱动的微服务-Spring Cloud Stream整合RocketMQ

    系列文章导航: Spring Cloud Alibaba微服务解决方案 常用MQ产品的选择 目前主流的MQ产品有kafka.RabbitMQ.ActiveMQ.RocketMQ等.在MQ选型时可以参照 ...

  5. 干货实操:微服务Spring Cloud 系列(二) Eureka服务发现与服务注册(strand alone)

    此篇主要实操Eureka 服务端的服务注册,以及服务发现,并需要认证才能访问控制中心. 分五个部分说明: 一.  认识 Eureka 二.  Eureka  服务端开发 三.  Eureka 客户端开 ...

  6. 微服务Spring Cloud Eureka 服务端-基本配置(eureka.server.xxx)

    2019独角兽企业重金招聘Python工程师标准>>> Eureka配置系列: Eureka 客户端-基本配置 https://my.oschina.net/langxSpirit/ ...

  7. 微服务 Spring Cloud Alibaba 项目搭建(七、RocketMQ 集成)

    RocketMQ介绍 RocketMQ 是一个 队列模型 的消息中间件,具有高性能.高可靠.高实时.分布式 的特点.它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在2016年 ...

  8. 微服务 Spring Cloud Alibaba 项目搭建(三、common通用模块创建)

    一.项目 - New - Module 二.选择Maven - jdk- Next 三.修改Name为common - 查看GroupId是否正确 - Finish 四.修改pom.xml文件,放入通 ...

  9. springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里: 哈喽沃德先生:Spring Cloud 系列之 Netflix Zuul 服务网关(一)​zhuanlan.zhihu.com 本篇文章讲解 Zuul ...

  10. Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案

    Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案 参考文章: (1)Zuul spring clo ...

最新文章

  1. 查询语句索引不能使用的一些情况
  2. iPhone 7 256GB版停售原因分析
  3. Bootstrap初学(一)
  4. android air flash,在Adobe Flash上​​触摸滚动Android上的Air
  5. Hyper-V 2016 系列教程34 在局域网内架设Windows时间服务器
  6. java 支付宝转账_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)...
  7. Android下pm命令详解
  8. 路由器防御Dos***方法
  9. soapUI使用教程----B站 特斯汀学院
  10. DBeaver之MYSQL驱动安装
  11. mysql dbutil_DBUtil连接数据库
  12. 制作属于自己的个人博客-超详细教程
  13. 苏州回收AB模块罗克韦尔、昆山回收AB触摸屏那些事
  14. 计算机管理系统在哪里,Win7系统realtek高清晰音频管理器在哪里打开?
  15. 安装pywifi的坑
  16. 程序员的职业规划_程序员如何能做好职业规划,走出迷惘呢?这个能力矩阵法要告诉你...
  17. MTK DDR进行ETT之后的压力测试--进行压力测试
  18. 鸽了亿下下的游记——2022 GDOI普及组游记
  19. 每日一书:《性能测试从零开始loadrunner入门与提升》PDF高清版
  20. 请教税控开票数据aardio如何连接

热门文章

  1. StrokeIt:让鼠标手势无处不在
  2. 2022年潜江中级工程师职称申报材料和申报渠道是什么呢?甘建二
  3. 网络编程——CS模型(总结)
  4. ATTCK实战系列(二)琢磨篇
  5. 我走进了微缩的“物联国”
  6. 图片轮播且可以实现5张翻页
  7. 华为天才少年主攻存储领域研究
  8. HTML+CSS大作业—汽车商城-功能齐全(42页) 大学生汽车商城网页设计模板代码 网购网页作业成品 汽车商城网站设计成品
  9. 大话拒绝服务攻击:DoS、DDoS、LDoS——“直男、舔狗和渣男”
  10. 2020年的计算机专业就业形势,2020计算机专业就业分析