Мы нашли ту же проблему; Zuul не будет ни повторять попытки, ни переходить при сбое на другие серверы в списке ленточных серверов, используя конфигурацию по умолчанию (Apache Http Client). Мы отследили его до этой строки кода в классе RibbonLoadBalancingHttpClient
:
@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
здесь , за исключением того, что мы переопределяем и исправляем метод 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
для ссылки из свойств, если хотите. После этого Зуул начнет уважать свойства ribbon.MaxAutoRetries
и ribbon.MaxAutoRetriesNextServer
.
Обратите внимание, что если вы используете Лента с Feign для вызовов сервера-> сервера, то эти вызовы Feign не затрагиваются, поскольку OpenFeign жестко кодирует эти два параметра в true, true
.