ZuulFallbackProvider未被调用

时间:2017-09-26 10:40:33

标签: java spring spring-boot netflix-zuul hystrix

如果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版本。

1 个答案:

答案 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);
    }
}