Spring cloud ZuulProxy失败,并带有“;RibbonCommand超时且没有可用的回退”;它应该在什么时候进行故障切换

Spring cloud ZuulProxy失败,并带有“;RibbonCommand超时且没有可用的回退”;它应该在什么时候进行故障切换,spring-cloud,Spring Cloud,简短描述: 我试图让ZuulProxy处理实例故障转移,但它抛出ZuulException:Forwarding error,而不是使用工作实例的结果进行响应 详细描述: 我的设置是一个独立的Eureka服务器、一个ConfigServer、一个ZuulProxy(@EnableZuulProxy)和两个服务实例,它们都在Eureka中注册 spring cloud starter的父代Angel.SR3正在运行一切 我的服务发现: @SpringBootApplication @EnableE

简短描述: 我试图让ZuulProxy处理实例故障转移,但它抛出ZuulException:Forwarding error,而不是使用工作实例的结果进行响应

详细描述: 我的设置是一个独立的Eureka服务器、一个ConfigServer、一个ZuulProxy(@EnableZuulProxy)和两个服务实例,它们都在Eureka中注册

spring cloud starter的父代Angel.SR3正在运行一切

我的服务发现:

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

  public static void main(String[] args) {
    SpringApplication.run(ConfigserverApplication.class, args);
  }
}
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
  public static void main(String[] args) {
    SpringApplication.run(ZuulProxy.class, args);
  }
}
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
@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);
  }
我的配置服务器:

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

  public static void main(String[] args) {
    SpringApplication.run(ConfigserverApplication.class, args);
  }
}
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
  public static void main(String[] args) {
    SpringApplication.run(ZuulProxy.class, args);
  }
}
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
@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);
  }
我的ZuulProxy:

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

  public static void main(String[] args) {
    SpringApplication.run(ConfigserverApplication.class, args);
  }
}
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
  public static void main(String[] args) {
    SpringApplication.run(ZuulProxy.class, args);
  }
}
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
@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);
  }
zuul:

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

  public static void main(String[] args) {
    SpringApplication.run(ConfigserverApplication.class, args);
  }
}
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
  public static void main(String[] args) {
    SpringApplication.run(ZuulProxy.class, args);
  }
}
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
@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);
  }
我的服务实例:

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

  public static void main(String[] args) {
    SpringApplication.run(ConfigserverApplication.class, args);
  }
}
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
  public static void main(String[] args) {
    SpringApplication.run(ZuulProxy.class, args);
  }
}
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
@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);
  }
我的服务实例使用
spring.application.name=examplems

当我启动两个服务实例并通过zuulproxy发送请求时,一切都正常工作,它将请求发送到我的两个服务实例。 但是,当我停止其中一个实例时,Zuul仍多次尝试将请求转发到停止的实例,然后失败:

com.netflix.zuul.exception.ZuulException: Forwarding error
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: examplemsRibbonCommand timed-out and no fallback available.
我希望对已停止实例的请求超时,并透明地故障转移到正在运行的实例。真正奇怪的是,zuul(根据日志)似乎先尝试停止的实例几次(当然失败),然后将请求转发给工作实例,获取OK应答,但它不会将OK应答转发给客户端,而是引发异常,导致响应失败,状态为500

请查看日志(我的工作实例在主机PMD11286上,我的停止实例在主机PMD11933上):

2015-08-20 08:45:46.343信息7700---[nio-9050-exec-9]o.s.c.n.zuul.filters.ProxyRouteLocator:查找路径路由:/example/ping/delay
2015-08-20 08:45:46.343调试7700---[nio-9050-exec-9]o.a.h.impl.conn.DefaultClientConnection:连接0.0.0.0:5025172.20.120.39:9060关闭
2015-08-20 08:45:46.343调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:47.372调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060超时。将使用另一个IP地址重试连接
2015-08-20 08:45:47.372调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:48.386调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060超时。将使用另一个IP地址重试连接
2015-08-20 08:45:48.386调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:49.416调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060超时。将使用另一个IP地址重试连接
2015-08-20 08:45:49.416调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:50.430调试7700---[N_MANAGER_TIMER]o.a.h.i.c.t.ThreadSafeClientConnManager:关闭过期的连接
2015-08-20 08:45:50.430调试7700---[N_MANAGER_TIMER]o.a.h.impl.conn.tsccm.ConnPoolByRoute:关闭过期的连接
2015-08-20 08:45:50.446调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060超时。将使用另一个IP地址重试连接
2015-08-20 08:45:50.446调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:51.475调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060超时。将使用另一个IP地址重试连接
2015-08-20 08:45:51.475调试7700---[nio-9050-exec-9].a.h.i.c.DefaultClientConnectionOperator:连接到PMD11933:9060
2015-08-20 08:45:52.505调试7700---[nio-9050-exec-9]o.a.h.impl.conn.DefaultClientConnection:连接0.0.0.0:5025172.20.120.39:9060关闭
2015-08-20 08:45:52.505调试7700---[nio-9050-exec-9]o.a.h.impl.conn.DefaultClientConnection:连接0.0.0.0:5025172.20.120.39:9060关闭
2015-08-20 08:45:52.505调试7700---[nio-9050-exec-9]o.a.h.impl.conn.DefaultClientConnection:连接0.0.0.0:5025172.20.120.39:9060关闭
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]o.a.h.client.protocol.RequestAddCookies:CookieSpec selected:ignoreCookies
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]o.a.h.client.protocol.RequestAuthCache:未在上下文中设置验证缓存
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]o.a.h.c.p.RequestTargetAuthentication:目标身份验证状态:未被质询
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]o.a.h.c.p.RequestProxyAuthentication:代理身份验证状态:未被质询
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]o.a.h.impl.conn.DefaultClientConnection:发送请求:GET/ping/delay HTTP/1.1
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]org.apache.http.wire:>>“GET/ping/delay http/1.1[\r][\n]”
2015-08-20 08:45:52.520调试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调试7700---[nio-9050-exec-9]org.apache.http.wire:>>“x-forwarded-prefix:/示例[\r][\n]”
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]org.apache.http.wire:>>“接受编码:deflate,gzip[\r][\n]”
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]org.apache.http.wire:>>“用户代理:curl/7.42.1[\r][\n]”
2015-08-20 08:45:52.520调试7700---[nio-9050-exec-9]org.apache.http.wire