Spring Cloud Zuul之ZuulFilter详解

Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口、请求拦截、路由转发等作用,其核心处理则是ZuulFilter

ZuulFilter部分源码

Zuul Filter全部继承于com.netflix.zuul.ZuulFilter这个抽象类,该抽象类则实现了com.netflix.zuul.IZuulFilter和java.lang.Comparable,其中IZuulFilter接口定义了以下两个方法。

shouldFilter() 判断是否致性run()方法

run() 过滤器核心方法,实现该方法从而达到我们的目的

Spring Cloud Zuul之ZuulFilter详解

ZuulFilter定义了以下方法

abstract public String filterType();

filterType定义过滤器的类型,按照类型对过滤器进行分类,以下是四种过滤器的作用

“pre”过滤器:用于处理路由前缀或路由前预处理

“route”过滤器:将接受到的请求转发至指定服务

“error”过滤器:用于错误处理

“post”过滤器:路由后处理,位于前三个过滤器之前,是最后一个调用的

public boolean isStaticFilter() {return true; // 默认为true}

isStaticFilter用于判断是否是静态的。静态过滤器是无状态的,可以重写该方法来覆盖默认值。

abstract public int filterOrder();

filterOrder用于判断过滤器的执行顺序,数字越小则执行得更早。

public boolean isFilterDisabled() // 默认为false

isFilterDisabled用于判断过滤器是否关闭,可重写该方法覆盖默认值。

ZuulFilter执行链

Spring Cloud Zuul之ZuulFilter详解

ZuulFilter的加载

Filter的加载所需要的主要类在Zuul-Core包下,这里简单介绍一下

ZuulServlet 负责Zuul初始化以及Filter的执行

ZuulRunner 负责将用户请求的javax.servlet.http.HttpServletRequest包装成com.netflix.zuul.http.HttpServletRequestWrapper。并封装ZuulProcessor的方法,以对外部类提供访问方式

ZuulProcessor 负责Filter的具体执行

ZuulLoader 负责加载过滤器到当前过滤器链中

Zuul默认过滤器

Spring Cloud Zuul中,为了让api网关组件可以被更方便的使用,它在http请求生命周期的各个阶段默认实现了一批核心过滤器,它们会在api网关服务启动的时候被自动加载和启动。我们可以在源码中查看和了解它们,它们定义与spring-cloud-netflix-core模块的
org.springframework.cloud.netflix.zuul.filters包下。在默认启动的过滤器中包含三种不同生命周期的过滤器,这些过滤器都非常重要,可以帮组我们理解zuul对外部请求处理的过程,以及帮助我们在此基础上扩展过滤器去完成自身系统需要的功能。

Pre过滤器

ServletDetectionFilter:它的执行顺序为-3,是最先被执行的过滤器。该过滤器总是会被执行,主要用来检测当前请求是通过Spring的DispatcherServlet处理运行的,还是通过ZuulServlet来处理运行的。它的检测结果会以布尔类型保存在当前请求上下文的isDispatcherServletRequest参数中,这样后续的过滤器中,我们就可以通过RequestUtils.isDispatcherServletRequest()和RequestUtils.isZuulServletRequest()方法来判断请求处理的源头,以实现后续不同的处理机制。一般情况下,发送到api网关的外部请求都会被Spring的DispatcherServlet处理,除了通过/zuul/*路径访问的请求会绕过DispatcherServlet(比如之前我们说的大文件上传),被ZuulServlet处理,主要用来应对大文件上传的情况。另外,对于ZuulServlet的访问路径/zuul/*,我们可以通过zuul.servletPath参数进行修改。

Spring Cloud Zuul之ZuulFilter详解

Servlet30WrapperFilter:它的执行顺序为-2,是第二个执行的过滤器,目前的实现会对所有请求生效,主要为了将原始的HttpServletRequest包装成Servlet30RequestWrapper对象。

Spring Cloud Zuul之ZuulFilter详解

FormBodyWrapperFilter:它的执行顺序为-1,是第三个执行的过滤器。该过滤器仅对两类请求生效,第一类是Context-Type为application/x-www-form-urlencoded的请求,第二类是Context-Type为multipart/form-data并且是由String的DispatcherServlet处理的请求(用到了ServletDetectionFilter的处理结果)。而该过滤器的主要目的是将符合要求的请求体包装成FormBodyRequestWrapper对象。

Spring Cloud Zuul之ZuulFilter详解


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdgdf.html