在最新版本的Spring云Netflix的官方文档(例如2.0.2.RELEASE,最后一个GA版本)中,它指出:
当存在Spring Retry时,负载平衡的RestTemplates、Feign和Zuul会自动重试任何失败的请求(假设您的配置允许这样做)。
但是,关于使用独立功能区(即负载平衡的 RestTemplate),这似乎是错误的。我无法使它工作,也找不到任何工作的例子。此外,我发现其他来源表明事实恰恰相反,例如:
那么,是文献记载错了,还是整个世界都遗漏了什么?
我们发现了同样的问题;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