我有两个Spring Boot应用程序,一个用作另一个的反向代理 . 我正在使用Spring Boot(1.4.1.RELEASE),Spring Cloud(Camden.SR1) . 我使用的是Swagger 2.5.0,一切都按预期工作 . 我的BootA应用程序托管了Eureka Server并包含Zuul映射,成功地将收到的请求转发到BootB应用程序 .

但是,如果我将Swagger升级到2.6.0,事情就会开始失败 . 首先,当我查看Eureka Dashboard时,BootB应用程序显示为“Unknown” . 实际上,在我的BootB的application.properties中,我没有定义eureka.instance.appname . 如果我在BootB的application.properties中定义它,应用程序将正确显示在Eureka Dashboard中 . 然而,Zuul使用的Load Balancer无法找到服务器BootB . 我收到一个ZuulException(转发错误),它是由netflix客户端的客户端异常引起的

2016-11-03 14:09:09.805 [http-nio-9080-exec-10] WARN [SendErrorFilter]过滤时出错com.netflix.zuul.exception.ZuulException:org.springframework.cloud.netflix中的转发错误 . 位于org.springframework.cloud.netflix的org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:139)中的zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:164) . zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:84)at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112)at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157)at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118)at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96 )在com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116)的com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81)org.springframework.web.se rvlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:157)位于org.springframework.web.servlet.mvc.AbstractController的org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequestInternal(ZuulController.java:43) . handle orquest(AbstractController.java:174)org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)at org位于org.springframework.web.servlet.FrameworkServ.doGet(FrameworkServlet .java:861)位于javax.servlet.http.HttpServlet的org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)的javax.servlet.http.HttpServlet.service(HttpServlet.java:622) . 服务(HttpServlet.java:729)在o rg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)atg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)org.apache.tomcat.websocket.server.WsFilter . org.springframework上的org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)中的doFilter(WsFilter.java:52)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) .gb.servlet.resource.ResourceUrlEncodingFilter.doFilterInternal(ResourceUrlEncodingFilter.java:53)org.apringframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain) .java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)at o rg.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:165)在org.apache的org.springframework.wef.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)的org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105) .catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy) .java:317)org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)at atorg.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)位于org.springframework.security的org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) . web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)在org.springframework.security.web.session.SessionManagementFilter.doFilter( SessionManagementFilter.java:137)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)在org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)在组织.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFi lter(SecurityContextHolderAwareRequestFilter.java:169)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)在Org.springframework.security.web上的org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) .FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)在org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331)位于org.springframework.web.filter.OncePe的org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)位于org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)的rRequestFilter.doFilter(OncePerRequestFilter.java:107)at minestar.core.app.boot.config.MinestarOAuth2AuthenticationProcessingFilter.doFilter(MinestarOAuth2AuthenticationProcessingFilter.java: 53)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)在org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)在org.springframework.security .gb.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331)位于org.springframework.web.filter.OncePerRequestFilter的org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) .doFilter(OncePerRequestFilter.java:107)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) )在org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)在org.springframework.security.web.FilterChainProxy $ VirtualGilterChain.doFilter(FilterChainProxy.java:331)org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)atg.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)org .springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain .java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)位于org.springframework.web的org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) . FILT er.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)在org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter.doFilter(OAuth2ClientContextFilter.java:60)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)在org.apache.catalina.core .ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)在org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89)在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)at atorg.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)org.apringframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)位于org.springframework.web的org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) .filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165 )在org.apa的org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:107)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) chegatalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve . java:198)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)at org.apache.catalina.core .standardHostValve.invoke(StandardHostValve.java:140)位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784)org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight . java:66)at org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(Ab stractProtocol.java:802)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1410)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 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)引起:com.netflix.client.ClientException:负载均衡器没有客户端的可用服务器:boot.net at com.netflix位于com.netflix.loadbalancer.reactive.LoadBalancerCommand $ .call(LoadBalancerCommand.java:184)的.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:468)位于com.netflix.loadbalancer.reactive.LoadBalancerCommand $ 1.call(LoadBalancerCommand.java) :180)在rx.Oternal.unsafeSubscribe(Observable.java:10211)rx.internal.operators.OnSubscribeConcatMap.call(OnS) ubscribeConcatMap.java:94)at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)at rx.Observable.unsafeSubscribe(Observable.java:10211)at rx.internal.operators.OperatorRetryWithPredicate $ SourceSubscriber $ 1.call( OperatorRetryWithPredicate.java:127)rx.internal.schedulers.TrampolineScheduler $ InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:73)at rx.internal.schedulers.TrampolineScheduler $ InnerCurrentThreadScheduler.schedule(TrampolineScheduler.java:52)at rx.internal.operators .OperatorRetryWithPredicate $ SourceSubscriber.onNext(OperatorRetryWithPredicate.java:79)at rx.internal.operators.OperatorRetryWithPredicate $ SourceSubscriber.onNext(OperatorRetryWithPredicate.java:45)at rx.internal.util.ScalarSynchronousObservable $ WeakSingleProducer.request(ScalarSynchronousObservable.java:276 )rx.Subscriber.setProducer(Subscriber.java:209)at rx.internal.util.ScalarSynchronousObservable $ JustOnSubscribe.call(ScalarSynchronousObservable.java:138)at rx . internal.util.ScalarSynchronousObservable $ JustOnSubscribe.call(ScalarSynchronousObservable.java:129)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) )rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.subscribe(Observable.java:10307)at rx.Observable.subscribe(Observable.java:10274)at rx.observables.BlockingObservable .blockForSingle(BlockingObservable.java:445)位于com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:102)的rx.observables.BlockingObservable.single(BlockingObservable.java:342)com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:81)位于org.springframework.cloud的org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:88) . netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:42)at com.netflix.hystrix.HystrixCommand $ 2.call(HystrixCommand.java:301)at com.netflix.hystrix.HystrixCommand $ 2.call( HystrixCommand.java:297)rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:48)rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)位于rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)的rx.internal.operators.OnSubscribeLift . 在rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)调用(OnSubscribeLift.java:30) tx rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)位于rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)的rx.Observable.unsafeSubscribe(Observable.java:10211) . 在rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)的rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)rx上的internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) .Observable.unsafeSubscribe(Observable.java:10211)位于rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)的rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)rx.Observable . 不安全订阅(Observable.java:10211)rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift .call(OnSubscribeLift.java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable .unsafeSubscribe(Observable.java:10211)位于rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)的rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)rx.Observable.unsafeSubscribe( Observable.java:10211)rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java) :10211)rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift . java:48)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10211)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) )rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.Observable.unsafeSubscri是(Observable.java:10211)rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)at rx.Observable.unsafeSubscribe(Observable) .java:10211)rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.internal.operators.OnSubscribeLift.call( OnSubscribeLift.java:48)rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10211)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java) :41)at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)at rx.Observable.unsafeSubscribe(Observable.java:10211)at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.ja) va:48)在rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)的rx.Observable.subscribe(Observable.java:10307)rx.Observable.subscribe(Observable.java:10274)rx . 在com.netflix的com.netflix.hystrix.HystrixCommand.queue(HystrixCommand.java:377)的rx.observables.BlockingObservable.toFuture(BlockingObservable.java:412)上的internal.operators.BlockingOperatorToFuture.toFuture(BlockingOperatorToFuture.java:51) .hystrix.HystrixCommand.execute(HystrixCommand.java:343)at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:133)...省略了112个常用帧

我在调试中运行了netflix组件,在使用Swagger 2.6.0时我没有看到BootB服务器,但我可以看到它是在旧版本中找到的 .

虽然我想在Swagger中修复一些错误,但这会阻止我使用它 . 分配eureka.instance.appname听起来像我正在治疗症状 . 任何人都可以指出我让这些组件协同工作的正确方向?从表面上看,我不明白为什么Swagger会影响Zuul,但我很难找到任何根本原因 . 谢谢你的帮助 .