Отказ в соединении не может использовать повтор при использовании ленты - PullRequest
0 голосов
/ 31 мая 2018

info:

spring-cloud.version=Dalston.SR5
spring-boot-starter-parent=1.5.7.RELEASE
zuul-core=1.3.0

Когда статус одного клиента неактивен (я имею в виду его уничтожение), но zuul также может иметь кэш информации об экземпляре, поэтому запрос будет перенаправлен на неработающий клиент, но не может иметьправильный ответ. Поэтому сделайте попытку еще раз, направьте запрос другому клиенту и получите правильный ответ.Это условие, как перезагрузить мой клиент.

, поэтому у меня есть несколько конфигураций:

ribbon:
    MaxAutoRetries: 1
    MaxAutoRetriesNextServer: 2
    OkToRetryOnAllOperations: true
    ReadTimeout: 1000
    ConnectTimeout: 250
    ServerListRefreshInterval: 1000
zuul:
  retryable: true

И я использую банку с пружинным повтором:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

, но это не такработать как я думаю.поэтому я отлаживаю код.RetryableRibbonLoadBalancingHttpClient будет использоваться при запросе маршрута zuul.исключение

org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient#execute
final HttpResponse httpResponse = RetryableRibbonLoadBalancingHttpClient.this.delegate.execute(httpUriRequest);

Я нашел код повторения после него, поэтому он не может перейти к логике повторения.Можете ли вы дать некоторые предложения, чтобы решить эту проблему?Информация об исключении:

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 172.16.73.151:8701 [/172.16.73.151] failed: Connection refused
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) ~[httpclient-4.5.3.jar:4.5.3]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.3.jar:4.5.3]
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient$1.doWithRetry(RetryableRibbonLoadBalancingHttpClient.java:89) ~[spring-cloud-netflix-core-1.3.6.RELEASE.jar:1.3.6.RELEASE]
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient$1.doWithRetry(RetryableRibbonLoadBalancingHttpClient.java:71) 

1 Ответ

0 голосов
/ 02 июня 2018

Я рекомендую вам добавить следующую конфигурацию и проверить, работает ли она:

@Configuration
public class RibbonConfig {

@Value("${ribbon.OkToRetryOnAllOperations}")
private Boolean retryOnAllOperations;

@Value("${ribbon.MaxAutoRetries}")
private Integer maxAutoRetries;

@Value("${ribbon.MaxAutoRetriesNextServer}")
private Integer maxAutoRetriesNextServer;

@Bean
public RetryHandler retryHandler() {
    IClientConfig clientConfig = DefaultClientConfigImpl
            .Builder
            .newBuilder()
            .withMaxAutoRetries(maxAutoRetries)
            .withMaxAutoRetriesNextServer(maxAutoRetriesNextServer)
            .withRetryOnAllOperations(retryOnAllOperations)
            .build();

    RetryHandler retryHandler = new DefaultLoadBalancerRetryHandler(maxAutoRetries, maxAutoRetriesNextServer, retryOnAllOperations);
    return new RequestSpecificRetryHandler(true, true, retryHandler, clientConfig );
 }

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public IRule ribbonRule() {
    return new RetryRule();
 }
}
...