Spring Cloud Zuul 工作原理以及实现自定义的Filter

Zuul Filter 链工作原理

Zuul 的核心逻辑是由一系列紧密配合工作的Filter来实现的,它们能够在进行 HTTP 请求或者响应的时候执行相关操作。可以说,没有Filter 责任链,就没有Zuul 关服务。

Zuul大部分功能都是通过Filter过滤器来实现的。

Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

  • PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  • ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
  • ERROR:在其他阶段发生错误时执行该过滤器。
  • 除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。

    如下是Zuul 请求生命周期官方图

    Zuul 原生Filters

    Zuul Server 如果使用@EnableZuulProxy注解,并搭配 Spring Boot Actuator,会多两个管控端点。

    添加 actuator 依赖:

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

    </dependency>

    如下可以查看到actuator 端点,包括filters和routes。

    1. /routes

    返回当前 Zuul Server 中已生成的映射规则,加上/details 可以查看到明细。

    http://localhost:5555/actuator/routes/details

    2. /filters

    返回当前 Zuul Server 中所有已注册生效的filters,如下所示。

    http://localhost:5555/actuator/filters

    包括filter 实现类路径,执行次序,释放被调用,以及释放静态等等。

    实现自定义的Filter

    在Zuul 中实现自定义Filter,继承 ZuulFilter类即可,ZuulFilter 是一个抽象类,我们需要覆盖其中的4个方法。

    public class MyFilter extends ZuulFilter {

    @Override

    String filterType() {

    return “pre”; //定义filter的类型,有pre、route、post、error四种

    }

    @Override

    int filterOrder() {

    return 10; //定义filter的顺序,数字越小表示顺序越高,越先执行

    }

    @Override

    boolean shouldFilter() {

    return true; //表示是否需要执行该filter,true表示执行,false表示不执行

    }

    @Override

    Object run() {

    return null; //filter需要执行的具体操作

    }

    }

    下面实现一个简单的pre filter,代码示例如下:

    public class FirstPreFilter extends ZuulFilter {

    @Override

    public String filterType() {

    return PRE_TYPE;

    }

    @Override

    public int filterOrder() {

    return 0;

    }

    @Override

    public boolean shouldFilter() {

    return true;

    }

    @Override

    public Object run() throws ZuulException {

    System.out.println(“这是第一个自定义Zuul Filter!”);

    return null;

    }

    }

    还需要将该pre filter 注入到Spring Bean 容器中,因此需要在启动主类中加入如下代码,即可完成一个Filter 的完整配置。

    @Bean

    public FirstPreFilter firstPreFilter(){

    return new FirstPreFilter();

    }

    访问Zuul 路由,如
    http://localhost:5555/client/add?a=1&b=2,查看IDEA console 的输出。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年3月25日
    下一篇 2019年3月25日

    相关推荐