-
Notifications
You must be signed in to change notification settings - Fork 0
Zuul 4 Fallback
Yasin Shaw edited this page Aug 30, 2018
·
1 revision
你可以通过创建一个类型为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
即可。
Powered By RedSpider
Sidebar