连接被拒绝 使用功能区时不能重试



info:

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

当一个客户端的状态为关闭(我的意思是杀死它(,但 zuul 也可以有实例信息的缓存,所以请求将路由到关闭客户端,但不能有一个正确的 response.so 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) 

我建议您添加以下配置并检查它是否有效:

@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();
}
}

最新更新