Zuul与Hystrix结合实现熔断
Zuul和Hystrix结合使用实现熔断功能时,需要实现FallbackProvider接口,该接口提供了两个方法,具体如下
(1) getRoute()方法:用于指定提供回退功能的服务。
(2) fallbackResponse()方法:用于执行回退操作的具体逻辑。
为了大家更好地理解如何使用Zuul和Hystrix实现熔断,接下来,我们通过一个案例来讲解,具体步骤如下:
(1)在网关项目gateway-zuul中创建网关处理类MyFallbackProvider类,用于处理回退逻辑,具体如例1所示。
例1 gateway-zuul\src\main\java\com\itheima\gatewayzuul\fallback\MyFallbackProvider.java
1 import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
2 import org.springframework.http.HttpHeaders;
3 import org.springframework.http.HttpStatus;
4 import org.springframework.http.MediaType;
5 import org.springframework.http.client.ClientHttpResponse;
6 import org.springframework.stereotype.Component;
7 import java.io.ByteArrayInputStream;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.nio.charset.Charset;
11 @Component
12 public class MyFallbackProvider implements FallbackProvider {
13 @Override
14 public String getRoute() {
15 return "eureka-consumer";
16 }
17 @Override
18 public ClientHttpResponse fallbackResponse(String route,
19 Throwable cause) {
20 return new ClientHttpResponse() {
21 @Override
22 public HttpStatus getStatusCode() throws IOException {
23 return HttpStatus.OK;
24 }
25 @Override
26 public int getRawStatusCode() throws IOException {
27 return this.getStatusCode().value();
28 }
29 @Override
30 public String getStatusText() throws IOException {
31 return this.getStatusCode().getReasonPhrase();
32 }
33 @Override
34 public void close() {
35 }
36 @Override
37 public InputStream getBody() throws IOException {
38 return new ByteArrayInputStream("连接异常,I'm the
39 fallback".getBytes());
40 }
41 @Override
42 public HttpHeaders getHeaders() {
43 HttpHeaders headers = new HttpHeaders();
44 MediaType mt = new MediaType("application", "json",
45 Charset.forName("UTF-8"));
46 headers.setContentType(mt);
47 return headers;
48 }
49 };
50 }
51 }
(2)启动eureka-server和gateway-zuul项目,使用浏览器访问http://localhost:8835/eureka-consumer/hi?id=12
,浏览器会显示MyFallbackProvider类中执行回退逻辑的方法中返回的字符串,如图1所示。
图1 回退逻辑执行效果图
如果需要所有的路由服务都能执行回退逻辑,只需要通过getRoute()方法中使用return语句返回“*”通配符,示例代码如下:
@Override
public String getRoute(){
return "*";
}