查看原文
其他

跟我学Spring Cloud(Finchley版)-18-Zuul深入

周立 IT牧场 2021-08-10


本节探讨Zuul的高级特性。

TIPS:

公众号已更新不少Zuul相关的文章,对于已经写过的内容,就不再啰嗦一遍了,直接贴地址吧。

过滤器详解

过滤器是Zuul的核心,Zuul大多功能都是基于过滤器实现的。详见:Spring Cloud Zuul过滤器详解 ,文章着重探讨了Zuul过滤器的生命周期、如何自定义过滤器、如何禁用指定过滤器等。

内置过滤器详解

Zuul内置了很多过滤器,这些过滤器帮助我们实现各种能力,来分析一下内置过滤器有哪些,分别是干嘛的。

详见:Spring Cloud内置的Zuul过滤器详解

为Zuul提供回退

跟我学Spring Cloud(Finchley版)-16-Zuul 讲过,Zuul整合了Hystrix,而Hystrix提供fallback的能力。

前文已详细讲过通用方式提供fallback、Feign提供fallback。如果不记得如何提供Fallback,可前往如下文章复习。

  1. /**

  2. * @author itmuch.com

  3. */

  4. @Component

  5. public class MyFallbackProvider implements FallbackProvider {

  6.  @Override

  7.  public String getRoute() {

  8.    // 表明是为哪个微服务提供回退,*表示为所有微服务提供回退

  9.    return "*";

  10.  }


  11.  @Override

  12.  public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

  13.    if (cause instanceof HystrixTimeoutException) {

  14.      return response(HttpStatus.GATEWAY_TIMEOUT);

  15.    } else {

  16.      return this.fallbackResponse();

  17.    }

  18.  }


  19.  public ClientHttpResponse fallbackResponse() {

  20.    return this.response(HttpStatus.INTERNAL_SERVER_ERROR);

  21.  }


  22.  private ClientHttpResponse response(final HttpStatus status) {

  23.    return new ClientHttpResponse() {

  24.      @Override

  25.      public HttpStatus getStatusCode() throws IOException {

  26.        return status;

  27.      }


  28.      @Override

  29.      public int getRawStatusCode() throws IOException {

  30.        return status.value();

  31.      }


  32.      @Override

  33.      public String getStatusText() throws IOException {

  34.        return status.getReasonPhrase();

  35.      }


  36.      @Override

  37.      public void close() {

  38.      }


  39.      @Override

  40.      public InputStream getBody() throws IOException {

  41.        return new ByteArrayInputStream("服务不可用,请稍后再试。".getBytes());

  42.      }


  43.      @Override

  44.      public HttpHeaders getHeaders() {

  45.        // headers设定

  46.        HttpHeaders headers = new HttpHeaders();

  47.        MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));

  48.        headers.setContentType(mt);

  49.        return headers;

  50.      }

  51.    };

  52.  }

  53. }

这样,当Zuul后端服务发生异常时,就会进到该Fallback类,并返回 服务不可用,请稍后再试。 。

高可用

详见:Zuul的高可用

实战技巧

其他

虽然是基于Edgware写的,但Finchley版本依然适用。

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

  • 001:《Java并发与高并发解决方案》学习笔记;

  • 002:《深入JVM内核——原理、诊断与优化》学习笔记;

  • 003:《Java面试宝典》

您的关注是对我最大的支持!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存