Spring cloud LoadBalancerFaignClient+;功能区重试属性的回退无效
我有两个micro服务A和B,使用eureka enable。我使用B中的外挂调用一个工作正常的服务。我正在尝试使用以下功能区属性使重试工作正常 假装客户Spring cloud LoadBalancerFaignClient+;功能区重试属性的回退无效,spring-cloud,spring-cloud-feign,netflix-ribbon,Spring Cloud,Spring Cloud Feign,Netflix Ribbon,我有两个micro服务A和B,使用eureka enable。我使用B中的外挂调用一个工作正常的服务。我正在尝试使用以下功能区属性使重试工作正常 假装客户 @FeignClient(name = "https://test", path = test, fallback = FeignClientFallback.class) public interface FeignClient { @RequestMapping(value = "getname", metho
@FeignClient(name = "https://test",
path = test, fallback = FeignClientFallback.class)
public interface FeignClient
{
@RequestMapping(value = "getname", method = RequestMethod.GET)
public Testdata find(@RequestParam(value = "id", required = true) String id)
}
spring
cloud:
loadbalancer:
retry:
enabled: true
ribbon.MaxAutoRetries: 3
ribbon.MaxAutoRetriesNextServer: 2
ribbon.OkToRetryOnAllOperations: true
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 45000
circuitBreaker:
enabled: true
sleepWindowInMilliseconds: 5000
requestVolumeThreshold: 20
服务B
@Autowired
FeignClient feignClient;
@RequestMapping(value = "/testdata", method = RequestMethod.GET)
public Testdata gettestdata() throws Exception
{
Testdata testdata = feignClient.find("apple");
return testdata;
}
功能区属性
@FeignClient(name = "https://test",
path = test, fallback = FeignClientFallback.class)
public interface FeignClient
{
@RequestMapping(value = "getname", method = RequestMethod.GET)
public Testdata find(@RequestParam(value = "id", required = true) String id)
}
spring
cloud:
loadbalancer:
retry:
enabled: true
ribbon.MaxAutoRetries: 3
ribbon.MaxAutoRetriesNextServer: 2
ribbon.OkToRetryOnAllOperations: true
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 45000
circuitBreaker:
enabled: true
sleepWindowInMilliseconds: 5000
requestVolumeThreshold: 20
spring云依赖关系是
spring-cloud-dependencies-Dalston.SR1
spring retry ,spring-cloud-starter-feign,spring-cloud-starter-ribbon
当服务A关闭,我试图从B调用服务,但重试不起作用,其直接调用回退时,是否缺少任何配置使其起作用
没有退路我遇到如下错误
com.netflix.client.ClientException: Load balancer does not have available server for client: test
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]
at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42) ~[rxjava-1.1.10.jar:1.1.10]
at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber$1.call(OperatorRetryWithPredicate.java:127) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:73) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.schedule(TrampolineScheduler.java:52) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:79) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:45) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276) ~[rxjava-1.1.10.jar:1.1.10]
at rx.Subscriber.setProducer(Subscriber.java:209) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10]
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10]
at rx.Observable.subscribe(Observable.java:10307) ~[rxjava-1.1.10.jar:1.1.10]
at rx.Observable.subscribe(Observable.java:10274) ~[rxjava-1.1.10.jar:1.1.10]
at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:445) ~[rxjava-1.1.10.jar:1.1.10]
at rx.observables.BlockingObservable.single(BlockingObservable.java:342) ~[rxjava-1.1.10.jar:1.1.10]
at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:117) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]
at org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:63) ~[spring-cloud-netflix-core-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:97) ~[feign-core-9.5.0.jar:?]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-9.5.0.jar:?]
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108) ~[feign-hystrix-9.5.0.jar:?]
我假设当它使用loadbalancerfeignclient执行时
return lbClient(clientName).executeWithLoadBalancer(ribbonRequest,
requestConfig).toResponse();
}
catch (ClientException e) {
IOException io = findIOException(e);
if (io != null) {
throw io;
}
throw new RuntimeException(e);
但我总是得到客户端异常,它没有得到重试,所以创建了一个bean作为主要的重试,但它仍然不工作
@Bean
@Primary
RetryHandler retryhandler() {
// TODO Auto-generated method stub
return new RequestSpecificRetryHandler(true, true);
}
非常感谢您的帮助,并试图理解您的帮助不起作用……这里也一样。你能解决这个问题吗?