当前位置: 首页 > 知识库问答 >
问题:

自动重试功能区(没有zuul):没有工作错误的留档?

岳城
2023-03-14

在最新版本的Spring云Netflix的官方文档(例如2.0.2.RELEASE,最后一个GA版本)中,它指出:

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

但是,关于使用独立功能区(即负载平衡的 RestTemplate),这似乎是错误的。我无法使它工作,也找不到任何工作的例子。此外,我发现其他来源表明事实恰恰相反,例如:

    < Li > spring-cloud with rest template//Ribbon/Eureka-当服务器不可用时重试 < li>Spring Cloud -在RestTemplate中重试工作?).

那么,是文献记载错了,还是整个世界都遗漏了什么?

共有1个答案

陈修诚
2023-03-14

我们发现了同样的问题;Zuul 既不会重试,也不会使用默认(Apache Http 客户端)配置故障转移到功能区服务器列表中的备用服务器。我们将其跟踪到功能区加载平衡HttpClient类中的以下代码行:

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

硬编码的< code>false,false参数有效地阻止了重试的发生。解决这个问题很容易。

将其添加到Zuul主应用程序类:

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

创建一个类< code > MyRibbonConfiguration ,并使用它来模拟这里的< code > ribbonLoadBalancingHttpClient 方法,只是我们覆盖并修复了导致问题的< code > 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将开始尊重缎带。最大自动重试功能区。MaxAutoRetriesNextServer 属性。

请注意,如果您使用带有Feign的功能区作为服务器 -

 类似资料:
  • 问题内容: 通过网络嵌套更新,打印“ abc已更新”,但实际值在Redis数据库中不更新。 注意:-上面的代码在localhost上有效,但更新未在heroku-redistogo上显示。 编辑:-我在本地主机上运行代码,redis连接到Redistogo。使用以下代码:- 设置快速会议:- 我还使用以下代码创建了另一个redisClient: 问题答案: 在Heroku上运行此代码时,您是否在控

  • 我正在使用IntelliJ IDEA Ultimate 2019.2开发一个Java w/gradle项目。 当我尝试运行JUnit测试时,会触发自动构建,并发出以下消息: 自动构建已完成并出现错误 在“问题”选项卡中,我看到了100多个错误,当我单击它们进行调查时,我可以看到这些错误不是真正的错误,编辑器的任何地方都没有红色的波形,如果我查看特定的错误(如java:找不到符号),我会确认它们是无

  • 问题内容: 当查看该方法的源代码时,我发现以下语法:存在没有主体的导出函数签名,以及包含实现的同一签名的非导出版本: 我认为这是一些语法,可让您轻松导出本地函数。那是对的吗?为什么不这样做而不仅仅是拥有一个导出函数并在包中使用它呢? 问题答案: 根据Go语言规范。 函数声明可以省略主体。这样的声明为Go外部实现的功能(例如汇编例程)提供了签名。 在这种情况下,该功能由386中的体系结构特定的汇编文

  • 我试图提出一个$http.post请求,但我有以下错误: XMLHttpRequest无法加载https://mipage.com/examplephp.请求标头字段Content-Type不允许访问控制允许标头在飞行前响应。 如果我将$http.post更改为$http.get请求,则服务器响应将使用JSON,因此。。我认为这不是CORS的问题。我还在爱奥尼亚项目中放置了一个代理。 这是我的功能

  • 我的GEOServer2.12.1二进制压缩文件解压缩并在Ubuntu14.04上运行。我使用的是Geoserver集成的GeoWebCache。我设置了Geoserver文档http://docs.Geoserver.org/latest/en/user/GeoWebCache/webadmin/layers.html中提到的所有内容 在预览时,放大和取出异常: 有什么帮助解决异常,以获得数据到

  • 我正在学习Kafka以下阿帕奇Kafka文件。我用默认配置启动它。 我运行kafka-console-producer.sh和kafka-console-conducer.sh来生成和使用消息,并且成功了。我写了一个java代码,使用producer API生成消息,这是可以的。这可以通过kafka-console-consumer.sh进行验证。代码与Apache Kafka指南相同: kafk