这篇文章将为大家详细讲解有关Spring Cloud中如何实现Zuul过滤器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
10年的思南网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整思南建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“思南网站设计”,“思南网站推广”以来,每个客户项目都认真落实执行。
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
@Configuration public 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 @SpringBootApplication public 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过滤器”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。