学科分类
目录
Spring Cloud

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 "*";
}
点击此处
隐藏目录