Java ZuulFallbackProvider未被调用
如果Zuul找不到服务,我会尝试后退。我有一个Zulsever,代码如下:Java ZuulFallbackProvider未被调用,java,spring,spring-boot,netflix-zuul,hystrix,Java,Spring,Spring Boot,Netflix Zuul,Hystrix,如果Zuul找不到服务,我会尝试后退。我有一个Zulsever,代码如下: @SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient public class ZuulServerApplication { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication.class, args);
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
@Bean
public ZuulFallbackProvider fallBackProvider() {
return new ZuulFallbackProvider() {
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpHeaders getHeaders() {
return null;
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("Hello".getBytes());
}
@Override
public String getStatusText() throws IOException {
// TODO Auto-generated method stub
return "Service Down";
}
@Override
public HttpStatus getStatusCode() throws IOException {
// TODO Auto-generated method stub
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
// TODO Auto-generated method stub
return 200;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
};
}
@Override
public String getRoute() {
// TODO Auto-generated method stub
return "*";
}
};
}
}
当我路由中的服务启动并运行时,我能够获得输出。但是,当我在路线上取消服务时,我预计会出现倒退。但我仍然看到一条错误消息,而不是回退消息。为什么不调用回退?我使用的是Dalston发行版。如果您将Zuul配置为直接连接到路由的URL,它将使用SimpleHostRoutingFilter,在出现错误时(几乎)总是返回500。任何后备提供商都不会介入 我使用了自定义SimpleHostRoutingFilter:
public class CustomErrorHostRoutingFilter extends SimpleHostRoutingFilter {
public CustomErrorHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties properties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientFactory httpClientFactory) {
super(helper, properties, connectionManagerFactory, httpClientFactory);
}
@Override
protected ZuulException handleException(Exception ex) {
if (ex instanceof ConnectTimeoutException) {
return new ZuulException(ex, "Downstream timeout", HttpServletResponse.SC_GATEWAY_TIMEOUT, ex.getMessage());
}
if (ex instanceof IOException) {
return new ZuulException(ex, "Downstream I/O error", HttpServletResponse.SC_SERVICE_UNAVAILABLE, ex.getMessage());
}
return super.handleException(ex);
}
}
还需要某种配置类:
@Configuration
@EnableZuulProxy
public class ZuulConfiguration {
@Bean
public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties,
ApacheHttpClientConnectionManagerFactory connectionManagerFactory,
ApacheHttpClientFactory httpClientFactory) {
return new CustomErrorHostRoutingFilter(helper, zuulProperties, connectionManagerFactory, httpClientFactory);
}
}
ZuulFallbackProvider中的
getRoute
方法在哪里?您使用的是哪个版本?我已经更新了代码。您从zuul收到了什么错误消息?zuul没有具体的错误消息。请求失败,出现500个错误,如果没有回退,这将是预期的行为。