2015-08-20 7 views
10

Krótki opis: Próbuję dostać ZuulProxy do obsługi instancji failover ale rzuca ZuulException: błąd Ekspedycja, zamiast odpowiadać z wynikiem działającej instancji.ZuulProxy nie powiedzie się z „RibbonCommand timed out i bez awaryjnej dostępnej” kiedy należy zrobić Failover

Długi opis: Moja konfiguracja to jeden samodzielny Eureka Server, jeden ConfigServer jeden ZuulProxy (@EnableZuulProxy) oraz dwie instancje obsługa, wszystkie z nich zarejestrowana w Eureka.

Wszystko działa z wiosenno-cloud-starter-rodzica Angel.SR3

Moja servicediscovery:

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

Moja ConfigServer:

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

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

Moja ZuulProxy:

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

routing-rules w Zuul:

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

Moi przypadki usługowa:

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

Moi instancji serwisowych zarejestrować się używając spring.application.name=examplems

Wszystko działa dobrze, gdy uruchamiam dwie instancje usługi i strzelam do żądań poprzez zuulproxy, a cały proces przenosi żądania do moich dwóch instancji serwisowych. Ale kiedy zatrzymać jedną z instancji Zuul nadal stara się przekazać żądanie zatrzymanego przykład kilka razy i wtedy nie jest on z:

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

Spodziewałem wniosek do zatrzymania instancji do czasu na zewnątrz, a nie na do działającej instancji w sposób przezroczysty. Naprawdę dziwne jest to, że wygląda na to, że zuul (zgodnie z dziennikami) próbuje kilka razy z zatrzymaną instancją (co oczywiście nie działa), a następnie przekazuje żądanie do działającej instancji, otrzymuje odpowiedź OK, ale zamiast przesyłać dalej OK, odpowiedzieć klientowi, że zgłasza wyjątek powodujący nieudaną odpowiedź ze statusem 500 !?

proszę zobaczyć dzienniki (mój przykład praca jest na gospodarza PMD11286 i mój zatrzymał instancja jest 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 

Gdybym poczekać minutę lub dwie usługa jest usuwany z Eureka i ostatecznie to dostaje propagowane do zuulproxy, co oznacza nie więcej ruchu do zatrzymanej usługi. Ale moim założeniem było, że wstążka/hysterix poradziłaby sobie z nieodpowiedzialną obsługą bardziej elegancko/szybko.

Dowolna wskazówka/sugestia? Thx Magnus

+0

Jak długo czekać przed ponowną próbą? Wstążka przechowuje pamięć podręczną serwerów i zajmuje trochę czasu (30 sekund +), aby uszkodzić serwery do usunięcia. – spencergibb

+0

Właściwie masz rację: @spencergibb, jeśli poczekam minutę lub dwie, usługa zostanie usunięta z eureka i ostatecznie zostanie ona propagowana do zuulproxy, co oznacza, że ​​nie będzie więcej ruchu do zatrzymanej usługi.Ale moim założeniem było, że wstążka/hysterix poradziłaby sobie z nieodpowiedzialną obsługą bardziej elegancko/szybko. Zaktualizuję mój post z tymi informacjami. – Magnus

Odpowiedz

23

1/timeout

Zuul wnioski są monitorowane przez hystrix którego celem (w tej aplikacji) jest zastosowanie limity czasu na długie wniosków do biegania.

Hystrix udostępnia dwa różne sposoby wykonywania poleceń i wymuszania limitu czasu: Izolacja wykonania SEMAPHORE i THREAD.

Gdy używana jest izolacja GWINT, komendy Hystrix są wykonywane w osobnym wątku z puli wątków. Następnie Hystrix "zatrzymuje" wątek, w którym znajduje się przychodzące żądanie, aż do otrzymania odpowiedzi z serwera w dół strumienia lub przekroczenia limitu czasu.

Po zastosowaniu izolacji SEMAPHORE polecenia Hystrix są wykonywane na wątku żądania. Przekroczenie limitu czasu jest wykrywane dopiero po otrzymaniu odpowiedzi z serwera typu "downstream". Jeśli więc skonfigurujesz Zuul/Hystrix z czasem oczekiwania wynoszącym 5 sekund, a twoja usługa zajmie 30 sekund, Twój klient zostanie powiadomiony o przekroczeniu limitu czasu dopiero po 30 latach - nawet jeśli usługa odpowiedziała pomyślnie (!)

Firma Netflix zaleca wykonanie NIŻEJ przez domyślnie z wyjątkiem rzadkich przypadków. Niestety integracja SpringCloud Zuul zmieniła ją na SEMAPHORE z nieznanych mi przyczyn. Aby uzyskać więcej informacji, patrz Why is ZUUL forcing a SEMAPHORE isolation to execute its Hystrix commands?.

To wyjaśnia, dlaczego pojawia się błąd 500, mimo że skontaktowano się z pozostałym serwerem Live.

2/RETRY

Ribbon jest używany do rzeczywistego połączenia do zdalnej obsługi. Korzysta z informacji dostarczonych przez Eureka w celu określenia dostępnych usług i odpowiadających im adresów. Eureka używa lokalnej pamięci podręcznej, która jest aktualizowana co 30 sekund. Tak więc, jak powiedział @spencergibb, najprawdopodobniej przez pewien czas utrzyma przestarzałe informacje (martwy serwer) - ale jest to oczekiwane.

Wstążka automatycznie ponawia próbę, gdy nie uda się nawiązać połączenia lub skontaktować się z usługą. Można go skonfigurować do ponawiania tego samego serwera kilka razy przed próbą innego. Nie pamiętam wartości domyślnych ani rzeczywiste właściwości konfiguracyjne, ale osobiście używam następujące ustawienia:

# 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

z dzienników okaże się to trwa około 1s aby nie połączyć się z usługą zdalną. To bardzo długo na zatrzymaną usługę. Próby połączenia z portem TCP bez usługi nasłuchiwania serwisowego powinny natychmiast zakończyć się niepowodzeniem (przynajmniej jeśli host/ip jest osiągalny, a próba połączenia nie kończy się w pustym polu) ...

Limit czasu połączenia jest kontrolowany przez następujące nieruchomość - upewnij się, że ustawiony jest na wartość descent:

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

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

Nadzieja ta informacja pomoże Ci rozwiązać problem ;-)

+0

Dziękuję @bertrand! Z pewnością dałeś mi kilka przydatnych informacji, z którymi można się dogadać. – Magnus

+0

Nie wahaj się zaznaczyć poprawną odpowiedź, jeśli ci pomoże. Jest to cenna informacja dla innych podczas przeglądania forum. Powodzenia z twoim problemem :) –

+0

@BertrandRenuart Chciałam tylko podziękować za doskonałą odpowiedź. – code

Powiązane problemy