Spring Cloud中如何实现Zuul过滤器

85次阅读
没有评论

共计 3447 个字符,预计需要花费 9 分钟才能阅读完成。

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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3447字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)