zuul过滤器
zuul有四种类型的过滤器
- pre 请求被路由之前执行,可以进行限流、身份验证、鉴权、参数检验、请求转发,用于设置RequestContext中的数据,以供下游的过滤器使用
- route 路由后,微服务调用前执行,用来发送请求给其他微服务,大部分工作为转换请求和响应数据
- post 在route和error之后执行,可以用来给响应添加头信息、收集统计信息和指标、将响应从微服务发送给客户端
- error 处理发生错误时调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { try { init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); try { preRouting(); } catch (ZuulException e) { error(e); postRouting(); return; } if (!RequestContext.getCurrentContext().sendZuulResponse()) { filterChain.doFilter(servletRequest, servletResponse); return; } try { routing(); } catch (ZuulException e) { error(e); postRouting(); return; } try { postRouting(); } catch (ZuulException e) { error(e); return; } } catch (Throwable e) { error(new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName())); } finally { RequestContext.getCurrentContext().unset(); } }
|
自定义过滤器
继承ZuulFilter抽象类
1 2 3 4 5 6 7 8 9 10 11
| abstract public String filterType();
abstract public int filterOrder();
boolean shouldFilter();
Object run();
|
禁用某种过滤器
zuul默认会启用一些过滤器,如servletDetectionFilter、formBodyWrapperFilter、debugFilter等
1 2 3 4
| zuul: DebugFilter: pre: disable: true
|