0604-Zuul構建API Gateway-Zuul的回退
阿新 • • 發佈:2018-05-11
-c spa fin aso put text lose awstat ica
一、概述
參看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#hystrix-fallbacks-for-routes
Zuul本事是基於Hystrix和Ribbon等,默認會支持Hystrix的Command等
在Zuul給定的路由回路跳閘,可以通過創建一個類型為ZuulFallbackProvider的bean來提供回退響應。在此bean中,您需要指定回退的路由ID,並提供ClientHttpResponse作為回退。這是一個非常簡單的ZuulFallbackProvider實現。
二、提供Hystrix路由回退
當Zuul中給定路由的電路被觸發時,您可以通過創建一個類型為ZuulFallbackProvider的bean來提供回退響應。在此bean中,您需要指定回退的路由ID,並提供ClientHttpResponse作為回退。這是一個非常簡單的ZuulFallbackProvider實現。
class MyFallbackProvider implements ZuulFallbackProvider { @Override public String getRoute() { return "customers"; } @Overridepublic ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throwsIOException { return 200; } @Override public String getStatusText() throws IOException { return "OK"; } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("fallback".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }
路由配置
zuul: routes: customers: /customers/**
如果您希望為所有路由提供默認回退,則可以創建類型為ZuulFallbackProvider的bean,並讓getRoute方法返回*或null
class MyFallbackProvider implements ZuulFallbackProvider { @Override public String getRoute() { return "*"; } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return 200; } @Override public String getStatusText() throws IOException { return "OK"; } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("fallback".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }
如果您想選擇基於故障原因的響應,請使用FallbackProvider,它將替換未來版本中的ZuulFallbackProvder。
class MyFallbackProvider implements FallbackProvider { @Override public String getRoute() { return "*"; } @Override public ClientHttpResponse fallbackResponse(final Throwable cause) { if (cause instanceof HystrixTimeoutException) { return response(HttpStatus.GATEWAY_TIMEOUT); } else { return fallbackResponse(); } } @Override public ClientHttpResponse fallbackResponse() { return response(HttpStatus.INTERNAL_SERVER_ERROR); } private ClientHttpResponse response(final HttpStatus status) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return status; } @Override public int getRawStatusCode() throws IOException { return status.value(); } @Override public String getStatusText() throws IOException { return status.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("fallback".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }
都是
0604-Zuul構建API Gateway-Zuul的回退