一、概述
针对Spring Cloud的Zuul配备了许多在代理和服务器模式下默认启用的ZuulFilter bean。
有关启用的可能过滤器,请参阅zuul过滤器包。
二、Zuul过滤器使用
2.1、传统过滤器:java.servlet.Filter
package javax.servlet; import java.io.IOException; public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; public void destroy(); }
2.2、ZuulFilter过滤器类型与生命周期
Zuul大部分功能是同过过滤器实现。有四种:
1》PRE,在请求被路由之前调用,可利用这种过滤器实现身份认证、在集群中选择请求的微服务、记录调试信息等
2》ROUTING,这种过滤器将请求路由到微服务。用于构建发送给微服务的请求,并使用apache httpclient或Netfilx Ribbon请求微服务
3》POST,在路由到微服务以后执行,可用来为响应添加标准的HTTP HEADER、收集统计信息和指标,将响应从微服务发送个客户段等
4》ERROR,在其他阶段发生错误是、时执行该过滤器
参看地址:http://techblog.netfilx.com/2013/06/announcing-zuul-edge-service-in-cloud.html
https://github.com/Netflix/zuul/wiki/how-it-works
生命周期图
2.3、代码开发
PreZuulFilter
package com.lhx.cloud; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; public class PreZuulFilter extends ZuulFilter { private static final Logger log = LoggerFactory.getLogger(PreZuulFilter.class); @Override public Object run() { // 具体执行 HttpServletRequest request = RequestContext.getCurrentContext().getRequest(); String host = request.getRemoteHost(); PreZuulFilter.log.warn("请求主机:" + host); return null; } @Override public boolean shouldFilter() { // 是否执行次过滤器 return true; } @Override public int filterOrder() { // 执行顺序 ,数值越大 越后执行 return 1; } @Override public String filterType() { // 执行类型 return "pre"; } }
注意要将被类扫描进去
@Bean public PreZuulFilter pre() { return new PreZuulFilter(); }
2.4、参看代码
包:spring-cloud-netflix-core-1.4.4.RELEASE.jar下的zuul的filter
2.5、禁用Zuul的Filter
禁用过滤器:zuul.<SimpleClassName>.<filterType>.disable=true
按照惯例,过滤器后面的包是Zuul过滤器类型。示例禁用 org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter
设置zuul.SendResponseFilter.post.disable=true
.