Spring Cloud Zuul 内置过滤器
下表为 Spring Cloud Zuul 内置过滤器 ,类名前面的数字代表了 Zuul 过滤器的执行顺序,数字越小,越先执行,...zuul.filters.support.FilterConstants
常量类 中定义了 过滤器的类型 和 执行顺序。
pre | route | post | error |
---|---|---|---|
-3 ServletDetectionFilter | 10 RibbonRoutingFilter | 900 LocationRewriteFilter | 0 SendErrorFilter |
-2 Servlet30WrapperFilter | 100 SimpleHostRoutingFilter | 1000 SendResponseFilter | |
-1 FormBodyWrapperFilter | 500 SendForwardFilter | ||
1 DebugFilter | |||
5 PreDecorationFilter | []() |
简要说明
pre
ServletDetectionFilter
:检查是否是 Web MVC,并设置isDispatcherServletRequest
到上下文Servlet30WrapperFilter
:Zuul 默认的包装器HttpServletRequestWrapper
,对请求参数的获取进行了统一化包装,该过滤器获取其原始Request对象,并用Servlet30RequestWrapper
进行重新包装,去除HttpServletRequestWrapper
中多余的操作,ctx.getRequest()
返回的HttpServletRequest
的实现是Servlet30RequestWrapper
FormBodyWrapperFilter
:如果是表单提交,用FormBodyRequestWrapper
包装Request,目的是解析表单数据重新编码,这时ctx.getRequest()
返回的HttpServletRequest
的实现是FormBodyRequestWrapper
DebugFilter
:如果设置了zuul.debug.request=true
,或在请求时 加上debug=true
的参数,过滤器会进行如下操作ctx.setDebugRouting(true);
、ctx.setDebugRequest(true);
- _
PreDecorationFilter
_:填充了大量的上下文 和 请求头 信息,在@EnableZuulProxy
注解下生效
route
- _
RibbonRoutingFilter
_:该过滤器使用Ribbon,Hystrix 和可插拔的HTTP客户端发送请求,routeHost
为空&&serviceId
不为空的时候执行 - _
SimpleHostRoutingFilter
_:真正实现地址转发,其实质是调用HttpClient
进行请求,routeHost
不为空的时候执行 SendForwardFilter
:使用RequestDispatcher
转发请求,转发位置存储在上下文forward.to
中
post
LocationRewriteFilter
:对 状态是301
,相应头中有Location
的相应进行处理SendResponseFilter
:将服务的响应数据写入当前响应
error
SendErrorFilter
:默认转发到/error
,可以设置error.path
属性修改默认的转发路径
过滤器类型
下面是几种标准过滤器类型,与请求的生命周期相对应
pre
在路由到 Origin 之前执行。常见用法如:权限校验、记录日志等route
将请求路由到 Origin 。使用 Apache HttpClient 或 Netflix Ribbon 构建和发送原始 HTTP 请求post
在请求被路由到 Origin 执行执行。常见用法如:设置 HTTP 响应头,统计指标、返回相应数据等error
当其中一个阶段发生错误时执行
除了标准的过滤器类型外,我们还可以创建自定义的过滤器类型。例如,有个自定义的 static
类型,直接生成相应数据,而不转发请求到 Origin。
Zuul 原生过滤器扩展
Class | filterType | filterOrder | 说明 |
---|---|---|---|
SurgicalDebugFilter | pre | 99 | 允许将特定请求路由到单独的调试集群或主机 |
StaticResponseFilter | static | 0 | 允许从 Zuul 本身生成响应,而不是将请求转发到 Origin |