Ribbon with Spring-retry make an error renewal for ServerStats
#3,131 opened on 2018年8月9日
説明
hi,
I'm using Feign,Ribbon, and when i import ZipKin ,the Spring-Retry would be impoted because of dependency. I think i've found a bug when Ribbon Feign work with Spring retry that the LoadBalancerCommand.java will make an error update on a Fail Server. The following is the recurrence .
POM :
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
i have two applications( InterfaceApplication TopicApplication ) ,and TopicApplication is two instances work on port 8002 and 8003 .InterfaceApplication will call TopicApplication.
InterfaceApplication yml:
ribbon:
eureka:
enabled: true
ReadTimeout: 3000
ConnectTimeout: 5000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 3
OkToRetryOnAllOperations: false
feign:
httpclient:
enabled: true
1、start applications

2、make interfaceApplication call TopicApplication,first server choose is 10.2.58.222:8003

3、kill 10.2.58.222:8003 , interfaceApplication will retry other server 10.2.58.222:8002, request will be success

4、but uri will be origin server 10.2.58.222:8003 , and serverstat too. the reason i think is server and serverstat create at LoadBanceCommend.java ,but retry execute at RetryTemplate.

5、Finally 10.2.58.222:8003 serverstat will be update,not 10.2.58.222:8002

and after an error update ,the fail server successiveConnectionFailureCount will be clear ,and change CircuitBreaker status cause subsequent requests lead to a fail server.
main code link : 1、LoadBalancerCommand.java 2、AbstractLoadBalancerAwareClient 3、RetryableFeignLoadBalancer 4、RetryTemplate