Zuul过滤器实现原理之Groovy
Zuul支持动态加载过滤器,并且这个功能是默认开启的。Zuul的这个功能是借助Groovy来实现的。
一,FilterFileManager
FilterFileManager是实现动态加载Zuul过滤器的入口。FilterFileManager会开启一个线程,定时扫描指定目录下的*.groovy文件。这个开启的线程的名字是:
GroovyFilterFileManagerPoller
这个定时任务扫描玩所有的文件以后,会调用FilterLoader的方法,把这些请求处理器注册到FilterRegistry的容器中。
FilterLoader.getInstance().putFilter(file);
二,GroovyCompile
在注册到FilterRegistry之前,首先会查询是否存在,不存在才会去注册。注册时首先会调用GroovyCompile.compile(file)方法加载请求处理器文件。
具体的实现源码可以参考:
GroovyCompile.compile()
三,如何指定groovy文件的路径
目前来看,Spring Cloud并没有提供这样的一个配置项,使得我们可以在配置文件中配置groovy文件的路径。
那么我们就只能通过硬编码的方式来指定加载路径了,这一点感觉有点坑,不知后续的版本会不会优化。
如何指定加载路径呢?
答案就是初始化FilterFileManager的时候来指定。
FilterFileManager.init()方法主持传入加载路径。
源码如下:
// 定于静态全局变量 单例模式初始化FilterFileManager
static FilterFileManager INSTANCE;
下面看init方法的实现:
if(INSTANCE = null){
INSTANCE = new FilterFileManager();
}
// 这个字段就是groovy文件存放路径,初始化调用init时传入,支持传入多个路径
INSTANCE.aDirectories = directories;
// 加载groovy文件的定时任务的执行间隔
INSTANCE.pollingIntervalSeconds = pollingIntervalSeconds
// 加载groovy文件的具体逻辑
INSTANCE.manageFiles();
// 开启线程
INSTANCE.startPoller();
最后,需要区分两个概念:Zuul动态路由和Zuul动态加载过滤器文件。这2个概念不要混淆了,Zuul动态路由没有借助groovy来实现,而Zuul动态加载过滤器文件是借助groovy来实现的。
网友评论