功能区自动重试(无zuul):不起作用+错误的文档?

时间:2018-11-18 13:12:50

标签: java spring load-balancing spring-cloud-netflix netflix-ribbon

在最新版的Spring Cloud Netflix官方文档中(例如2.0.2.RELEASE, the last GA version),声明:

  

当出现Spring Retry时,负载平衡的RestTemplates,Feign和Zuul会自动重试任何失败的请求(假设您的配置允许这样做)。

但是关于使用独立功能区(即负载平衡的RestTemplates),这似乎是错误的。我无法使其正常工作,也找不到任何有效的示例。而且,我发现其他资料也表明事实恰好相反,例如:

那么,这是文档错误还是整个世界都缺少了什么?

1 个答案:

答案 0 :(得分:2)

我们发现了同样的问题; Zuul不会使用默认(Apache Http Client)配置重试或故障转移到功能区服务器列表中的备用服务器。我们在RibbonLoadBalancingHttpClient类中将其跟踪到this line of code

@Override
public RequestSpecificRetryHandler getRequestSpecificRetryHandler(
        RibbonApacheHttpRequest request, IClientConfig requestConfig) {
    return new RequestSpecificRetryHandler(false, false, RetryHandler.DEFAULT,
            requestConfig);
}

经过硬编码的false, false参数有效地阻止了重试。很容易解决这个问题。

将此添加到您的Zuul主应用程序类:

@RibbonClients(
    defaultConfiguration = {EurekaRibbonClientConfiguration.class,
        MyRibbonConfiguration.class})

创建一个类MyRibbonConfiguration并使用它来模拟ribbonLoadBalancingHttpClient方法here,除了我们重写并修复会引起问题的getRequestSpecificRetryHandler方法之外。

public class MyRibbonConfiguration {

  @RibbonClientName
  private String name = "client";

  @Bean
  public RibbonLoadBalancingHttpClient ribbonLoadBalancingHttpClient(
      IClientConfig config, ServerIntrospector serverIntrospector,
      ILoadBalancer loadBalancer, RetryHandler retryHandler, CloseableHttpClient httpClient) {

    RibbonLoadBalancingHttpClient client =
        new RibbonLoadBalancingHttpClient(httpClient, config, serverIntrospector) {
          @Override
          public RequestSpecificRetryHandler getRequestSpecificRetryHandler(
              RibbonApacheHttpRequest request, IClientConfig requestConfig) {
            return new RequestSpecificRetryHandler(true, true, RetryHandler.DEFAULT,
                requestConfig);
          }
        };

    client.setLoadBalancer(loadBalancer);
    client.setRetryHandler(retryHandler);

    Monitors.registerObject("Client_" + this.name, client);
    return client;
  }
}

根据需要调整true, true以引用属性。这样,Zuul将开始尊重ribbon.MaxAutoRetriesribbon.MaxAutoRetriesNextServer属性。

请注意,如果您将功能区与Feign一起用于服务器->服务器调用,则这些Feign调用不会受到影响,因为OpenFeign将这两个参数硬编码为true, true