Netflix Zuul 自定义过滤器

在 Java 中,要创建一个 Zuul 1.x 自定义过滤器,首先需要实现 com.netflix.zuul.ZuulFilter 抽象类。这个抽象类定义了过滤器的基本结构和行为,而 ZuulFilter 类实现了 IZuulFilter 接口。

ZuulFilter 抽象类

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

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

a8827c0b011d86464c6b2df448c99058_1733723676910-837ef6d6-f3ce-4ca6-9769-25161239384e.png

通过上图可知,成功执行了自定义的过滤器。

点击下载/查看本教程相关资料或者源代码。
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号