在 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 地址,控制台输出如下图:

通过上图可知,成功执行了自定义的过滤器。
点击下载/查看本教程相关资料或者源代码。