【问题标题】:Setting default fallback for Zuul routing failures为 Zuul 路由失败设置默认回退
【发布时间】: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


【解决方案1】:

最新版本的 Spring Cloud 现在支持回退。请查看帖子 - Fallback methods at Zuul server in Spring cloud 了解更多详情

【讨论】:

  • 您应该考虑设置一个版本号,以帮助将用户引导至解决他们问题的正确修订版/版本。
  • 谢谢.. 查看 spring cloud 版本 1.2.3.BUILD-SNAPSHOT
  • 谢谢,我们会尝试测试一下
猜你喜欢
  • 2017-12-23
  • 2020-05-07
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多