【发布时间】:2017-02-08 04:01:15
【问题描述】:
当 Zuul 边缘服务器中出现路由故障并且没有任何运气时,我们正在尝试覆盖您获得的默认错误页面。我们的路线设置如下:
zuul:
routes:
ui: /**
api: /api/**
默认的 SendErrorFilter 会默认尝试将请求发送到 /error,并且当 ui 服务启动并运行时会起作用,因为它将提供 /error。但问题是当 ui 服务器关闭时,它会尝试路由到 /error 并失败。然后,您会在屏幕上看到一个令人讨厌的异常,说存在转发错误并且没有可用的回退。
com.netflix.zuul.exception.ZuulException: Forwarding error
org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:140)
org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:105)
com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112)
com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:197)
com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:161)
com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:120)
com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:84)
com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:111)
Root Cause:
com.netflix.hystrix.exception.HystrixRuntimeException: uiRibbonCommand failed and no fallback available.
com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:807)
com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:794)
rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:77)
rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70)
rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70)
rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70)
com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1516)
com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1406)
com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:314)
com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:306)
你如何在 Zuul 中设置默认的 Fallback 来处理这些错误,这样用户就不会看到讨厌的异常?我见过这个open issue on spring-cloud-netflix (#250),但我会处理所有路由的默认回退,而不仅仅是特定路由。这样做的正确方法是什么?
【问题讨论】:
-
您想要默认的回退还是自定义错误?因为您映射了默认路由
/**,所以您丢失了/error。您可以通过server.error.whitelabel.enabled=false关闭错误页面。 docs.spring.io/spring-boot/docs/current/reference/html/… -
我们想提供一个自定义的 500 错误 html 页面。所以我想我们可以做一个回退,从边缘服务器返回一个视图,但不知道怎么做。
-
zuul 不支持回退。你可以写一个后置过滤器。
标签: spring spring-cloud netflix-zuul hystrix spring-cloud-netflix