覆盖zuul错误过滤器导致转发错误
Posted
技术标签:
【中文标题】覆盖zuul错误过滤器导致转发错误【英文标题】:Overriding zuul error filter results in Forwarding error 【发布时间】:2017-03-31 00:51:48 【问题描述】:我正在尝试覆盖 zuul 代理的默认 senderorfilter,以便当我的网关后面的服务崩溃/关闭时,我可以提供更好的响应。这是我从Customizing Zuul Exception中的答案中获取的代码
public class RabbrErrorFilter extends ZuulFilter
private static final Logger log = LoggerFactory.getLogger(RabbrErrorFilter.class);
protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";
@Override
public String filterType()
return "post";
@Override
public int filterOrder()
return Integer.MIN_VALUE; // Needs to run before SendErrorFilter which has filterOrder == 0
@Override
public boolean shouldFilter()
// only forward to errorPath if it hasn't been forwarded to already
RequestContext ctx = RequestContext.getCurrentContext();
return ctx.containsKey("error.status_code") && !ctx.getBoolean(SEND_ERROR_FILTER_RAN,false);
@Override
public Object run()
try
RequestContext ctx = RequestContext.getCurrentContext();
Object e = ctx.get("error.exception");
if (e != null && e instanceof ZuulException)
ZuulException zuulException = (ZuulException)e;
log.error("Zuul failure detected: " + zuulException.getMessage(), zuulException);
// Remove error code to prevent further error handling in follow up filters
ctx.remove("error.status_code");
// Populate context with new response values
ctx.setResponseBody("Overriding Zuul Exception Body");
ctx.getResponse().setContentType("application/json");
ctx.setResponseStatusCode(500); //Can set any error code as excepted
ctx.setSendZuulResponse(false);
catch (Exception ex)
log.error("Exception filtering in custom error filter", ex);
ReflectionUtils.rethrowRuntimeException(ex);
return null;
我用调试器检查了 run() 中的代码在 zuul 异常被抛出时被执行,但是在控制台日志中我得到了这个:
com.netflix.zuul.exception.ZuulException: Forwarding error
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:157) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:132) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:78) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2]
at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:197) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:161) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:120) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.1.0.jar:1.1.0]
at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.1.0.jar:1.1.0]
来自网关后面的服务的响应超时,状态为 500。
-- 编辑* 更新 spring-cloud 依赖项(包含 zuul 1.3.0 核心)并没有解决这个问题
【问题讨论】:
显然你只需要the keymaster。 能否为zuul添加你的application.yml。 Zuul 的默认 SendErrorFilter 与 1.3.0 版本相比发生了很大变化。它不再是后置过滤器。它是 1.3.0 的错误过滤器,内部结构发生了很大变化。最好查看新的 SendErrorFilter 的源代码。 【参考方案1】:请检查此解决方案:Spring Cloud: Zuul error handling。它对我有用,特别是对于 Zuul 的转发错误。
Zuul 错误处理通过 RibbonRoutingFilter 和 SendErrorFilter 进行处理,并将任何错误请求转发到 $error.path,默认为“/error”。如果您使用 Spring Boot 的 BasicErrorController 处理的默认值。您可以覆盖此行为并实现您自己的 ErrorController。
您不一定需要遵循 Vnd 错误样式,只需遵循编写 Spring 的 ErrorController
的自定义实现的一般逻辑即可。
【讨论】:
帖子已经很老了,但这是我最终解决这个问题的方法 请在此处包含链接页面的重要部分,以防出现 404。 @Veve 我已经添加了该帖子中的关键引语,这几乎不足以获得想法并提出自定义解决方案。不确定复制粘贴整个代码块是否合乎道德以上是关于覆盖zuul错误过滤器导致转发错误的主要内容,如果未能解决你的问题,请参考以下文章
《springcloud 二》SrpingCloud Zuul 微服务网关搭建
Idea下SpringCloud2实验(Zuul网关实现路由转发和过滤)