如果Zuul找不到服务,我正试图回退。我有一个带有以下代码的ZuulSever:
@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 Release版本。
答案 0 :(得分:0)
如果将Zuul配置为直接连接到您的路线的URL,它将使用SimpleHostRoutingFilter,如果出现错误,它将(几乎)始终返回500。任何FallbackProviders都不会加入。
我改用了一个自定义的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);
}
}