SpringCloudZuul网关过滤器

ZuulFilter接口抽象类

Spring Cloud Zuul中实现的过滤器必须包含4个基本特征:过滤类型、执行顺序、执行条件、具体操作。

对应以下四个方法:

String filterType();该函数需要返回一个字符串来代表过滤器的类型,这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了4种不同生命周期的过滤器类型:
    pre 可以在请求被路由之前调用
    routing 在路由请求时被调用
    post 在routing和error过滤器之后被调用
    error 处理请求时发生错误时被调用

int filterOrder();通过int值来定义过滤器的执行顺序,数值越小优先值越高。
 
boolean shouldFilter(); 返回一个boolean值来判断该过滤器是否要执行。

Object run(); 过滤器的具体逻辑。

 

本文介绍Spring Cloud Zuul的核心过滤器。

默认启用的过滤器有三种,对应三种不同的生命周期。

pre过滤器

ServletDetectionFilter:-3,最先被执行的过滤器,用来检测当前的请求是通过Spring的DispatcherServlet处理运行的,还是ZuulServlet来处理运行的。

Servlet30WrapperFilter:-2,是第二个被执行的过滤器。主要是为了将原始的HttpServletRequest包装成Servlet30RequestWrapper对象。

FromBodyWrapperFilter:-1,第三个被执行的过滤器。仅对两类请求生效,第一类是Content-Type为application/x-www-form-urlencoded的请求,第二类是Content-Type为multipart/form-data并且是由Spring的DispatcherServlet处理的请求。 该过滤器的主要目的是将符合要求的请求体包装成FormBodyRequestWrapper对象。

DebugFilter:1,第四个被执行的过滤器。

PreDecorationFilter:5,第五个被执行的过滤器。该过滤器会判断当前请求上下文中是否存在forward.to和serviceId参数,如果都不存在,那么它就会执行具体过滤器的操作(如果有一个存在的话,说明当前请求已经被处理过了,因为这两个信息就是根据当前请求的路由信息加载进来的)

 

route过滤器

RibbonRoutingFilter:10,route阶段的第一个过滤器。只对请求上下文中存在serviceId参数的请求进行处理,即只对通过serviceId配置路由规则的请求生效。

SimpleHostRoutingFilter:100,它的执行顺序为100,是route阶段第二个过滤器。只对请求上下文中存在routeHost参数的请求进行处理,即只对通过url配置路由规则的请求生效。

SendForwardFilter:500,是route阶段最后一个过滤器,该过滤器只对请求上下文中存在forward.to参数的请求进行处理。

 

post过滤器

SendErrorFilter:0,POST阶段的第一个过滤器,仅在请求上下文中包含error.status_code参数并且还没有被该过滤器处理过的时候执行。

SendResponseFilter:1000,POST阶段的最后一个过滤器,该过滤器会检查请求上下文中是否包含请求响应相关的头信息、响应数据流或是响应体,只有在包含它们其中一个时候执行处理逻辑。

 

 

 ErrorFilter过滤器的不足

            try {
                preRoute();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                route();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                postRoute();
            } catch (ZuulException e) {
                error(e);
                return;
            }

pre、route、post阶段产生的异常都会被error过滤器捕捉并且进行处理,但是由post阶段产生的异常,在经过error过滤器处理之后,就没有其他类型的过滤器来接手了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章