2

使用Spring-云Angel.SR6:春季云Zuul重试当实例关闭

这里是我的春天启动的应用程序与@EnableZuulProxy配置:

server.port=8765 

ribbon.ConnectTimeout=500 
ribbon.ReadTimeout=5000 
ribbon.MaxAutoRetries=1 
ribbon.MaxAutoRetriesNextServer=1 
ribbon.OkToRetryOnAllOperations=true 

zuul.routes.service-id.retryable=true 

我有2个实例运行在随机端口上的service-id。这些实例以及Zuul实例向Eureka成功注册,我可以通过访问http://localhost:8765/service-id/ ....来访问实例上的RESTful端点,并发现它们以循环方式进行平衡。

我想杀掉其中一个service-id实例,并且当这个不存在的实例接下来处于转发状态时,让Zuul尝试联系它,失败并重试其他实例。

这是可能的,还是我误解了文档?当我尝试上述配置时,针对已停止实例的请求'destined'失败,并发生500次转发错误。从Zuul堆栈跟踪:

com.netflix.zuul.exception.ZuulException: Forwarding error 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:140) 

.... 

Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: service-idRibbonCommand timed-out and no fallback available 

随后的请求按预期成功。这种行为一直持续到从Zuul的注册表中删除不存在的实例。

编辑:更新至Brixton.M5。行为没有变化。下面是详细的豪猪例外:

Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: service-id timed-out and no fallback available. 
    at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:806) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:790) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:99) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14] 
    at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1521) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1411) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:314) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:306) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:162) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable$2.call(Observable.java:154) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.Observable.unsafeSubscribe(Observable.java:7710) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:100) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14] 
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14] 
    at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:958) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:978) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:100) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_66] 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_66] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_66] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_66] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] 
    ... 1 common frames omitted 

Caused by: java.util.concurrent.TimeoutException: null 
    at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:601) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:581) ~[hystrix-core-1.4.23.jar:1.4.23] 
    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:99) ~[rxjava-1.0.14.jar:1.0.14] 
    ... 15 common frames omitted 
+0

它适用于Brixton快照。我没有设置所有这些“ribbon。*”属性,所以也许这实际上是以某种方式伤害了,或者它可能只适用于较新的堆栈?你可以试试布里克斯顿? –

+0

你可以显示'zuul.routes'配置的其余部分。你在做GET操作吗? – spencergibb

+0

@DaveSyer我切换到Brixton.M5并删除了'ribbon。*'属性,但它没有任何区别。我注意到,我不必设置'eureka.instance.metadata.instanceId',而必须设置'eureka.instance。instanceId'来区分我的实例(它们在'server.port = 0'上运行的b/c)。 – grinder

回答

0

丝带使用已注册的服务尤里卡,所以它是由尤里卡更新服务状态,让来电者知道可用的服务器。

据我了解,当一台服务器出现故障时,有两种方法可以知道:
1.等待尤里卡服务器更新服务状态。但是这个更新需要一些时间,默认30秒。
2.尝试调用并将其标记为向下,

所以,在你的问题,你说后的第一个请求失败(也许将与以后尤里卡服务器确认),随后请求成功。我认为这是正确的行为。

1

我有同样的问题。这为我解决了这个问题:

关于this article功能区仅在http客户端设置为功能区的restclient时才会返回。默认功能区正在使用不重试任何请求的Apache HTTP客户端。

由于事实上,色带的RESTClient实现已经过时,你应该考虑使用弹簧重试(https://github.com/spring-projects/spring-retry

请记住,你也有,当你在色带配置重来处理zuul的椎超时为好。