Skip to content

Zuul 4 Fallback

Yasin Shaw edited this page Aug 30, 2018 · 1 revision

Hystrix 路由回退

你可以通过创建一个类型为FallbackProvider的bean来做回退。在这个bean里,你可以返回一个自定义的ClientHttpResponse。比如:

public class OrdersFallbackProvider implements FallbackProvider {

    Logger logger = LoggerFactory.getLogger(OrdersFallbackProvider.class);

    @Override
    public String getRoute() {
        return "order-service";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, final Throwable cause) {
        if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return response(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                logger.info("origin status value: " + status.value());
                return HttpStatus.OK.value();
            }

            @Override
            public String getStatusText() throws IOException {
                logger.info("origin status text: " + status.toString());
                return HttpStatus.OK.toString();
            }

            @Override
            public void close() {
            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("this is orders fallback".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

相关配置:

zuul:
  routes:
      order-service:
        path: /orders/**

注册bean:

@Bean
public FallbackProvider ordersFallbackProvider() {
	return new OrdersFallbackProvider();
}

这个时候,启动所有微服务,然后关掉order-service微服务。然后调用网关接口/orders/123,发现返回this is orders fallback

注意这里的getRoute方法,其实是需要返回微服务的id,而不是字面意义上的“路由”!

如果想给所有的微服务都设置一个默认的Fallback怎么办?在getRoute方法返回*或者null即可。

Sidebar

Clone this wiki locally