疯狂Spring Cloud连载(25)Zuul过滤器


声明:本文转载自https://my.oschina.net/JavaLaw/blog/1581419,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993

Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383

 

Zuul过滤器

        本小节的内容涉及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

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

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

过滤器动态加载

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

        <dependency>             <groupId>org.codehaus.groovy</groupId>             <artifactId>groovy-all</artifactId>             <version>2.4.12</version>         </dependency> 

        接下来,在网关项目的应用类中,调用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微服务架构实战》

Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993

Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383

本书代码共享地址:https://gitee.com/yangenxiong/SpringCloud

本文发表于2017年11月29日 12:33
(c)注:本文转载自https://my.oschina.net/JavaLaw/blog/1581419,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1915 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1