【问题标题】:Configuration based fallback for route基于配置的路由回退
【发布时间】:2019-05-23 20:40:00
【问题描述】:

应用程序有两个实例:instance-1instance-2

让我们假设

  1. instance-1 可通过localhost:8090 访问
  2. instance-2 可通过localhost:9080 访问

如何配置zuul代理,以便---首先访问instance-1,如果出现任何异常/失败,切换到instance-2

注意:不使用 Eureka

我能够使用带有外观控制器的 hystrix 并在后备中通过 RestTemplate 调用 instance-2 来使其工作。

但我正在寻找一些更好的方法,其中 Zuul 负责路由以及 HTTPHeaders、HttpMethod 和其他请求属性的镜像。

如果有人尝试过类似的事情,请建议我。

【问题讨论】:

    标签: spring-cloud netflix-zuul spring-cloud-netflix hystrix api-gateway


    【解决方案1】:

    您可以将 Zuul 配置为在当前实例和下一个实例上重试。

    zuul:
      retryable: true
    
    ribbon:
      MaxAutoRetries: 1
      MaxAutoRetriesNextServer: 3
      OkToRetryOnAllOperations: true
    
    yourApplication:
        ribbon:
            listOfServers: localhost:8090, localhost:9080
    

    根据上述配置,如果路由到 8090 实例失败,Zuul 会再尝试一次连接到 8090,如果该调用也失败,Zuul 将路由到 9080 进行下一次调用。您可以阅读有关这些重试配置的更多信息here

    【讨论】:

    • 如果您不想在当前服务器失败后重试,您可以将MaxAutoRetries设置为0。
    • 我试过这种方法,当两个实例都启动并运行时它工作正常。当我关闭一个实例时,我看到异常消息com.netflix.zuul.exception.ZuulException: Forwarding error间歇性地弹出。我试过添加连接超时、读取超时和类似的配置属性,但是当实例关闭时总是会弹出异常然后重定向到listOfServers 中的下一个实例。是否有任何遗漏需要我们添加以跳过此异常情况。
    • 是的,这是 Zuul 中的一个问题。 Zuul 找不到上游服务时抛出错误。因此,您需要扩展ErrorFilter 并提供自定义逻辑以返回404503 状态码。这可能是同一个问题:github.com/spring-cloud/spring-cloud-netflix/issues/406
    • 查看此以了解如何自定义ZuulException 处理:stackoverflow.com/questions/36461493/customizing-zuul-exception
    • Spring Retry 必须添加到类路径以实现重试功能。它是否添加到类路径中?如果添加了,那么 Zuul 应该在 404/503 上重试。
    猜你喜欢
    • 2021-08-02
    • 2021-03-26
    • 2019-03-13
    • 2016-09-04
    • 2011-06-20
    • 2021-01-04
    • 2011-02-27
    • 2017-08-23
    • 2021-02-13
    相关资源
    最近更新 更多