2015-08-20 8 views
10

Breve descrizione: Sto cercando di ottenere uno ZuulProxy per gestire un'istanza di failover ma getta ZuulException: errore di inoltro, invece di rispondere con un risultato da un'istanza di lavoro.ZuulProxy fallisce con "RibbonCommand scaduta e non di ripiego disponibile" quando si dovrebbe fare il failover

Descrizione lunga: La mia configurazione è uno stand-alone Eureka Server, uno ConfigServer, uno ZuulProxy (@EnableZuulProxy) e due istanze di servizio, tutti registrato a Eureka.

Tutto è in esecuzione con la primavera-cloud-starter-genitore Angel.SR3

mio servicediscovery:

@SpringBootApplication 
@EnableEurekaServer 
public class EurekaServer { 
    public static void main(String[] args) { 
     SpringApplication.run(EurekaServer.class, args); 
    } 
} 

mio ConfigServer:

@SpringBootApplication 
@EnableAutoConfiguration 
@EnableConfigServer 
@ComponentScan 
@EnableDiscoveryClient 
public class ConfigserverApplication { 

    public static void main(String[] args) { 
    SpringApplication.run(ConfigserverApplication.class, args); 
    } 
} 

mio ZuulProxy:

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan 
@EnableDiscoveryClient 
@EnableZuulProxy 
public class ZuulProxy { 
    public static void main(String[] args) { 
    SpringApplication.run(ZuulProxy.class, args); 
    } 
} 

Il di routing-rules in Zuul:

zuul.ignoredServices=* 
zuul.routes.examplems=/example/** 

mie istanze di servizio:

@SpringBootApplication 
@Configuration 
@EnableAutoConfiguration 
@EnableDiscoveryClient 
@ComponentScan(basePackages = "se.example.microservices") 
@EnableSwagger 
public class Application { 

    public static void main(String[] args) throws Exception{ 
    SpringApplication.run(Application.class, args); 
    } 

mie istanze di servizio si registrano utilizzando spring.application.name=examplems

Tutto funziona correttamente quando accendo due istanze di servizio e sparo le richieste attraverso il zuulproxy, che esegue il round delle richieste alle mie due istanze di servizio. Ma quando mi fermo una delle istanze Zuul tenta ancora di inoltrare la richiesta all'istanza fermato più volte e poi viene a mancare con:

com.netflix.zuul.exception.ZuulException: Forwarding error 
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: examplemsRibbonCommand timed-out and no fallback available. 

mi aspettavo la richiesta all'istanza fermato per una pausa e il failover a un'istanza in esecuzione in modo trasparente. La cosa veramente strana è che sembra che zuul (in base ai log) prima provi con l'istanza arrestata più volte (cosa che ovviamente fallisce) e poi inoltra la richiesta all'istanza di lavoro, ottiene una risposta OK ma invece di inoltrare la richiesta OK rispondi al client genera un'eccezione che genera una risposta fallita con stato 500 !?

Si prega di consultare i registri (il mio esempio di lavoro è su un host PMD11286 e il mio esempio fermato è in PMD11933):

2015-08-20 08:45:46.343 INFO 7700 --- [nio-9050-exec-9] o.s.c.n.zuul.filters.ProxyRouteLocator : Finding route for path: /example/ping/delay 
2015-08-20 08:45:46.343 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Connection 0.0.0.0:50251<->172.20.120.39:9060 closed 
2015-08-20 08:45:46.343 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:47.372 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connect to PMD11933:9060 timed out. Connection will be retried using another IP address 
2015-08-20 08:45:47.372 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:48.386 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connect to PMD11933:9060 timed out. Connection will be retried using another IP address 
2015-08-20 08:45:48.386 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:49.416 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connect to PMD11933:9060 timed out. Connection will be retried using another IP address 
2015-08-20 08:45:49.416 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:50.430 DEBUG 7700 --- [N_MANAGER_TIMER] o.a.h.i.c.t.ThreadSafeClientConnManager : Closing expired connections 
2015-08-20 08:45:50.430 DEBUG 7700 --- [N_MANAGER_TIMER] o.a.h.impl.conn.tsccm.ConnPoolByRoute : Closing expired connections 
2015-08-20 08:45:50.446 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connect to PMD11933:9060 timed out. Connection will be retried using another IP address 
2015-08-20 08:45:50.446 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:51.475 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connect to PMD11933:9060 timed out. Connection will be retried using another IP address 
2015-08-20 08:45:51.475 DEBUG 7700 --- [nio-9050-exec-9] .a.h.i.c.DefaultClientConnectionOperator : Connecting to PMD11933:9060 
2015-08-20 08:45:52.505 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Connection 0.0.0.0:50251<->172.20.120.39:9060 closed 
2015-08-20 08:45:52.505 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Connection 0.0.0.0:50251<->172.20.120.39:9060 shut down 
2015-08-20 08:45:52.505 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Connection 0.0.0.0:50251<->172.20.120.39:9060 closed 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.client.protocol.RequestAddCookies : CookieSpec selected: ignoreCookies 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.client.protocol.RequestAuthCache : Auth cache not set in the context 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.c.p.RequestTargetAuthentication : Target auth state: UNCHALLENGED 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.c.p.RequestProxyAuthentication  : Proxy auth state: UNCHALLENGED 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Sending request: GET /ping/delay HTTP/1.1 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "GET /ping/delay HTTP/1.1[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "x-forwarded-host: 127.0.0.1:9050[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "x-forwarded-prefix: /example[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "accept-encoding: deflate, gzip[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "user-agent: curl/7.42.1[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "accept: */*[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "Netflix.NFHttpClient.Version: 1.0[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "X-netflix-httpclientname: examplems[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "Host: PMD11286:9060[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "Connection: Keep-Alive[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : >> "[\r][\n]" 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> GET /ping/delay HTTP/1.1 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> x-forwarded-host: 127.0.0.1:9050 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> x-forwarded-prefix: /example 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> accept-encoding: deflate, gzip 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> user-agent: curl/7.42.1 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> accept: */* 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> Netflix.NFHttpClient.Version: 1.0 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> X-netflix-httpclientname: examplems 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> Host: PMD11286:9060 
2015-08-20 08:45:52.520 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : >> Connection: Keep-Alive 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "HTTP/1.1 200 OK[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "Server: Apache-Coyote/1.1[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "X-Application-Context: examplems:9060[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "Content-Type: text/plain;charset=UTF-8[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "Content-Length: 76[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "Date: Thu, 20 Aug 2015 06:45:52 GMT[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "[\r][\n]" 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] o.a.h.impl.conn.DefaultClientConnection : Receiving response: HTTP/1.1 200 OK 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << HTTP/1.1 200 OK 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << Server: Apache-Coyote/1.1 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << X-Application-Context: examplems:9060 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << Content-Type: text/plain;charset=UTF-8 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << Content-Length: 76 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.headers     : << Date: Thu, 20 Aug 2015 06:45:52 GMT 
2015-08-20 08:45:52.630 DEBUG 7700 --- [nio-9050-exec-9] org.apache.http.wire      : << "Svar efter 100 ms v[0xc3][0xa4]ntan. Kan [0xc3][0xa4]ndras med: ?time=200 15-08-20 08:45:52,618" 
2015-08-20 08:45:52.630 WARN 7700 --- [nio-9050-exec-9] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering 

com.netflix.zuul.exception.ZuulException: Forwarding error 
     at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:142) 
     at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:107) 
     at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) 
     at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:197) 
     at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:161) 
     at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:120) 
     at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:84) 
     at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:111) 
     at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:77) 
     at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:158) 
     at org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequestInternal(ZuulController.java:43) 
     at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:146) 
     at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: examplemsRibbonCommand timed-out and no fallback available. 
     at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:782) 
     at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:769) 
     at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:77) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) 
     at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1444) 
     at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1334) 
     at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:314) 
     at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:306) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable$1.call(Observable.java:144) 
     at rx.Observable$1.call(Observable.java:136) 
     at rx.Observable.unsafeSubscribe(Observable.java:7466) 
     at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:78) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70) 
     at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:923) 
     at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) 
     at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37) 
     at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) 
     at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:943) 
     at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:98) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     ... 1 common frames omitted 
Caused by: java.util.concurrent.TimeoutException: null 
     at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:589) 
     at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:570) 
     at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:77) 
     ... 15 common frames omitted 

Se aspetto un paio di minuti il ​​servizio viene rimosso da Eureka e alla fine questo viene propagata a zuulproxy, che significa non più traffico verso il servizio interrotto. Ma la mia ipotesi era che ribbon/hysterix avrebbe gestito un servizio non rispondente più elegante/rapidamente.

Qualche suggerimento? Thx Magnus

+0

Quanto tempo hai aspettato prima di riprovare? Il nastro conserva una cache di server e impiega un po 'di tempo (30 secondi +) per la rimozione dei server guasti. – spencergibb

+0

In realtà sei @spencergibb corretto, se aspetto un minuto o due il servizio viene rimosso da eureka e alla fine questo viene propagato a zuulproxy, il che significa che non c'è più traffico verso il servizio interrotto.Ma la mia ipotesi era che ribbon/hysterix avrebbe gestito un servizio non rispondente più elegante/rapidamente. Aggiornerò il mio post con queste informazioni – Magnus

risposta

23

1/TIMEOUT

richieste Zuul sono monitorati da Hystrix cui scopo (in tale applicazione) si applica timeout sulle richieste esecuzione prolungata.

Hystrix fornisce due diversi modi per eseguire comandi e applicare i timeout: isolamento esecuzione SEMAPHORE e THREAD.

Quando si utilizza l'isolamento THREAD, i comandi Hystrix vengono eseguiti su un thread separato da un pool di thread. Hystrix quindi "mette in pausa" il thread che contiene la richiesta in arrivo fino a quando non viene ricevuta una risposta dal server downstream o si verifica un timeout.

Quando si utilizza l'isolamento SEMAPHORE, i comandi Hystrix vengono eseguiti sul thread di richiesta. I timeout vengono rilevati solo dopo aver ricevuto una risposta dal server downstream. Quindi, se si configura Zuul/Hystrix con un timeout di 5 secondi e il servizio richiede 30 secondi, il client verrà informato del timeout solo dopo 30 secondi - anche se il servizio ha risposto correttamente (!)

Netflix consiglia l'esecuzione di THREAD da parte di impostazione predefinita tranne in alcuni rari casi. Sfortunatamente, l'integrazione di SpringCloud Zuul lo ha cambiato in SEMAPHORE per ragioni a me sconosciute. Vedere Why is ZUUL forcing a SEMAPHORE isolation to execute its Hystrix commands? per ulteriori informazioni.

Questo spiega perché si riceve un errore 500 anche se il server live rimanente è stato contattato con successo.

2/RETRY

nastro viene utilizzato per effettuare la chiamata effettiva di servizio remoto. Usa le informazioni fornite da Eureka per determinare i servizi disponibili e gli indirizzi corrispondenti. Eureka utilizza una cache locale che viene aggiornata ogni 30 secondi. Quindi, come ha detto @spencergibb, è probabile che conservi le informazioni obsolete per un po '(server morto), ma è previsto.

Il nastro riproverà automaticamente quando non riesce a connettersi/contattare un servizio. Può essere configurato per riprovare lo stesso server un paio di volte prima di provarne un altro. Non mi ricordo i valori di default, né la proprietà di configurazione attuale, ma personalmente ho utilizzato le seguenti impostazioni:

# Max number of retries on the same server (excluding the first try) 
ribbon.maxAutoRetries = 1 

# Max number of next servers to retry (excluding the first server) 
ribbon.MaxAutoRetriesNextServer = 2 

3/Connect Timeout

dai registri appare che ci vuole circa 1s fallire il tentativo di connessione al servizio remoto. Questo molto lungo per un servizio interrotto. I tentativi di connettersi a una porta TCP senza ascolto del servizio dovrebbero fallire immediatamente (almeno se l'host/ip è raggiungibile e il tentativo di connessione non termina nel vuoto) ...

Il timeout di connessione è controllato dal seguente - assicuratevi che impostato su un valore di discesa:

# Connect timeout used by Apache HttpClient 
ribbon.ConnectTimeout=3000 

# Read timeout used by Apache HttpClient 
ribbon.ReadTimeout=5000 

auguriamo che queste informazioni vi aiuta a risolvere il problema ;-)

+0

Grazie @bertrand! Mi hai dato sicuramente alcune informazioni utili per approfondire. – Magnus

+0

Non esitare a contrassegnare la risposta valida se ti aiuta. Questa è una preziosa informazione per gli altri durante la navigazione nel forum. Buona fortuna per il tuo problema :) –

+0

@BertrandRenuart Volevo solo dire grazie per una risposta eccellente. – code

Problemi correlati