在 Java 中,要创建一个 Zuul 1.x 自定义过滤器,首先需要实现 com.netflix.zuul.ZuulFilter 抽象类。这个抽象类定义了过滤器的基本结构和行为,而 ZuulFilter 类实现了 IZuulFilter 接口。
ZuulFilter 是 Netflix Zuul 1.x 中用于构建过滤器的抽象类。它定义了过滤器的基本框架和行为模式,是实现自定义过滤器的基础。通过继承这个抽象类并实现其中的关键方法,开发人员可以方便地创建各种类型的过滤器,如前置过滤器、路由过滤器、后置过滤器和错误过滤器,以满足不同的网关处理需求。
ZuulFilter 抽象类部分源码:
public abstract class ZuulFilter implements IZuulFilter, Comparable<ZuulFilter> { private final AtomicReference<DynamicBooleanProperty> filterDisabledRef = new AtomicReference<>(); /** * 来按类型对过滤器进行分类。Zuul 中的标准类型是: * pre 用于路由前过滤; * route 用于路由到原服务; * post 用于路由后过滤; * error 用于错误处理; * 我们还支持用于静态响应的 “static ”类型,请参见 StaticResponseFilter。 * 任何过滤器类型都可以通过调用 FilterProcessor.runFilters(type) 来创建或添加和运行。 * 返回:代表该类型的字符串 */ abstract public String filterType(); /** * 过滤器还必须定义 filterOrder()。 * 如果过滤器的优先级并不重要,则过滤器可以具有相同的 filterOrder。 * 返回值:过滤器的整数顺序 */ abstract public int filterOrder(); //... }
IZuulFilter 接口源代码:
public interface IZuulFilter { /** * 该方法返回 “true ”表示应调用 run() 方法 * 返回值: * 如果应调用 run() 方法,则返回 true;如果返回 false,则不会调用 run() 方法。 */ boolean shouldFilter(); /** * 如果 shouldFilter() 为 true,则将调用本方法。本方法是 ZuulFilter 的核心方法 * 返回值: * 可能会返回一些任意模型。 * 抛出: * ZuulException - 如果在执行过程中发生错误。 */ Object run() throws ZuulException; }
继承 ZuulFilter 抽象类,实现其中的 filterType、filterOrder、shouldFilter 和 run 方法,代码如下:
package com.hxstrive.hystrix_demo.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import javax.servlet.http.HttpServletRequest; /** * 自定义过滤器 * @author hxstrive.com */ public class CustomFilter extends ZuulFilter { // 过滤器类型 // 取值:pre、route、post、error @Override public String filterType() { return "pre"; } // 过滤器执行顺序,值越小优先级越高,值越大优先级越低 @Override public int filterOrder() { return 0; } // 是否执行过滤器,true:执行,false:不执行 @Override public boolean shouldFilter() { return true; } // 过滤器执行逻辑 @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); // 在这里可以进行请求验证等前置操作 System.out.println("CustomPreFilter: " + request.getMethod() + " " + request.getRequestURL()); return null; } }
使用 Spring 配置类配置自定义的过滤器,代码如下:
package com.hxstrive.hystrix_demo.config; import com.hxstrive.hystrix_demo.filter.CustomFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 应用配置类 * @author hxstrive.com */ @Configuration public class AppConfig { // 创建自定义的过滤器 @Bean public CustomFilter customFilter() { return new CustomFilter(); } }
如果不想使用配置类进行配置,也可以使用 @Component 或 @Service 等注解将类注册到 Spring 的 IoC 容器。
启动 Zuul 示例应用,使用浏览器访问 http://localhost:9000/api/order/order/1 地址,控制台输出如下图:
通过上图可知,成功执行了自定义的过滤器。
点击下载/查看本教程相关资料或者源代码。