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过滤器处理之后,就没有其他类型的过滤器来接手了。