千家信息网

Spring Cloud中如何实现Zuul过滤器

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关Spring Cloud中如何实现Zuul过滤器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Zuul过滤器过滤器优先级Spring C
千家信息网最后更新 2026年11月03日Spring Cloud中如何实现Zuul过滤器

这篇文章将为大家详细讲解有关Spring Cloud中如何实现Zuul过滤器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Zuul过滤器

过滤器优先级

Spring Cloud为HTTP请求的各个阶段,提供了多个过滤器,这些过滤器的执行顺序,由它们各自提供的一个int值决定,提供的值越小,优先级越高。图7-6展示了默认的过滤器,以及它们的优先级。

图7-6 Spring Cloud自带的过滤器及优先级

如图7-6,在routing阶段,会优先执行Ribbon路由的过滤器,再执行简单路由过滤器。

自定义过滤器

了解过滤器的执行顺序后,我们编写一个自定义过滤器。新建过滤类,继承ZuulFilter,实现请见代码清单7-10。

代码清单7-10:

codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\filter\MyFilter.java

public class MyFilter extends ZuulFilter {    // 过滤器执行条件    public boolean shouldFilter() {        return true;    }    // 执行方法    public Object run() {        System.out.println("执行 MyFilter 过滤器");        return null;    }    // 表示将在路由阶段执行    public String filterType() {        return FilterConstants.ROUTE_TYPE;    }    // 返回1,路由阶段,该过滤将会最先执行    public int filterOrder() {        return 1;    }}

新建的自定义过滤器,将会在"routing"阶段执行,优先级为1,也就是在routing阶段,该过滤器最先执行。另外注意shouldFilter方法,过滤最终是否执行,由该方法决定,本例返回true,表示访问任何的路由规则,都会执行该过滤器。为了让Spring容器知道过滤器的存在,需要对该类进行配置,代码清单7-11为配置类。

代码清单7-11:

codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\filter\FilterConfig.java

@Configurationpublic class FilterConfig {        @Bean        public MyFilter myFilter() {                return new MyFilter();        }}

启动集群,访问网关:http://localhost:8080/test/1,会看到控制输出:"执行 MyFilter 过滤器"。实际上,访问任何一个配置好的路由,都会进行输出。

过滤器动态加载

相对于集群中的其他节点,网关更需要长期、稳定地提供服务。如果需要增加过滤器,重启网关代价太大,为了解决该问题,Zuul提供了过滤器的动态加载功能,可以使用Groovy来编写过滤器,然后添加到加载目录,让Zuul去动态加载。先为网关项目加入Groovy的依赖:

                    org.codehaus.groovy            groovy-all            2.4.12        

接下来,在网关项目的应用类中,调用Zuul的API来实现动态加载,请见代码清单7-12。

代码清单7-12:

codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\GatewayApplication.java

@EnableZuulProxy@SpringBootApplicationpublic class GatewayApplication {                @PostConstruct        public void zuulInit() {        FilterLoader.getInstance().setCompiler(new GroovyCompiler());        // 读取配置,获取脚本根目录        String scriptRoot = System.getProperty("zuul.filter.root", "groovy/filters");        // 获取刷新间隔        String refreshInterval = System.getProperty("zuul.filter.refreshInterval", "5");        if (scriptRoot.length() > 0) scriptRoot = scriptRoot + File.separator;        try {            FilterFileManager.setFilenameFilter(new GroovyFileFilter());            FilterFileManager.init(Integer.parseInt(refreshInterval), scriptRoot + "pre",                             scriptRoot + "route", scriptRoot + "post");        } catch (Exception e) {            throw new RuntimeException(e);        }        }        public static void main(String[] args) {                new SpringApplicationBuilder(GatewayApplication.class).properties(                                "server.port=8080").run(args);        }}

在启动类中,增加了zuulInit方法,使用@PostConstruct进行修饰。该方法中,先读取 "zuul.filter.root"和"zuul.filter.refreshInterval"两个属性,分别表示动态过滤器的根目录以及刷新间隔,刷新间隔以秒为单位,这两个属性,优先读取配置文件的值,如果没有则使用默认值。在配置文件中,可使用下面的配置片断:

zuul:  filter:    root: "groovy/filters"    refreshInterval: 5

调用FilterFileManager的init方法,初始化3个过滤器目录:pre、route和post。为了测试动态加载,使用Groovy编写一个最简单的过滤器,请见代码清单7-13。

代码清单7-13:codes\07\03\zuul-gateway\src\main\java\groovy\filters\DynamicFilter.groovy

class DynamicFilter extends ZuulFilter {        public boolean shouldFilter() {                return true;        }        public Object run() {                System.out.println("=========  这一个是动态加载的过滤器:DynamicFilter");                return null;        }        public String filterType() {                return FilterConstants.ROUTE_TYPE;        }        public int filterOrder() {                return 3;        }}

与前面的过滤器一致,同样继承ZuulFilter。需要注意的是,本例的过滤器,并没有一开始放到动态加载的过滤器目录中,读者在测试时,需要先启动网关项目,再将DynamicFilter.groovy放到对应目录中。

完成以上工作后,启动网关项目,访问以下地址:http://localhost:8080/test/crazyit,控制台中并没有输出DynamicFilter的信息。将DynamicFilter.groovy复制到src/main/java/groovy/filters/route目录,等待几秒后,重新访问以上的地址,可以看到网关的控制台输出如下:

=========  这一个是动态加载的过滤器:DynamicFilter

关于"Spring Cloud中如何实现Zuul过滤器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

过滤器 动态 代码 清单 网关 配置 方法 路由 阶段 优先级 目录 项目 输出 篇文章 控制 两个 地址 属性 控制台 文件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 广州万易互联网科技有限公司 互联网科技会 艾特科技互联网 科技创新互联网企业 上海致骋互联网科技 火传媒上海互联网科技 中国的互联网科技企业的崛起 随着互联网科技发展 厦门比较好的科技互联网公司 广州市恰铎互联网科技有限公司 亳州好赞互联网科技有限公司 东莞新华互联网科技学校 互联网金融科技公司的优势 风投北京互联网科技 卡尔迅互联网科技有限公司 互联网与数字科技关系 35岁以上互联网科技行业 广西科技产业互联网是什么 互联网领先科技活动 友谊互联网络科技 互联网科技logo 甘肃拓世互联网科技有限公司 湖南洣水互联网科技有限公司扣款 顶级互联网科技成果有哪些 重庆威客帮互联网科技 受益于互联网科技的高速发展 昭通互联网科技选哪家 互联网科技与大数据专业 中国科技和美国互联网
0