博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zuul源码分析之Filter管理
阅读量:5739 次
发布时间:2019-06-18

本文共 2858 字,大约阅读时间需要 9 分钟。

  hot3.png

zuul支持动加载Filter类文件。实现原理是监控存放Filter文件的目录,定期扫描这些目录,如果发现有新Filter源码文件或者Filter源码文件有改动,则对文件进行编译加载。目前zuul支持使用Groovy编写的Filter。

FilterFileManager

FilterFileManager用于管理Filter存放目录,并定期扫描目录的变化。 

FilterFileManager的类图 
他的功能如下:

  • 开启一个线程,开始轮询
void startPoller() {        poller = new Thread("GroovyFilterFileManagerPoller") {            public void run() {                while (bRunning) {                    try {                        sleep(pollingIntervalSeconds * 1000);                        manageFiles();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        };        poller.setDaemon(true);        poller.start();    }

每次轮询,处理目录内的所有*.groovy文件,即调用FilterLoader.getInstance().putFilter(file);

void processGroovyFiles(List
aFiles) { for (File file : aFiles) { FilterLoader.getInstance().putFilter(file); } } void manageFiles() throws Exception, IllegalAccessException, InstantiationException { List
aFiles = getFiles(); processGroovyFiles(aFiles); }

FilterLoader

编译、加载filter文件,并且检查源文件是否有变更,除此之外,它还按照filterType组织并维护List<ZuulFilter>

FilterLoader类图

主要逻辑

public boolean putFilter(File file) throws Exception {    String sName = file.getAbsolutePath() + file.getName();    // 如果文件在上次加载后发生了变化,重新编译加载    if (filterClassLastModified.get(sName) != null && (file.lastModified() != filterClassLastModified.get(sName))) {        filterRegistry.remove(sName);    }    ZuulFilter filter = filterRegistry.get(sName);    if (filter == null) {        // 编译、加载文件        Class clazz = COMPILER.compile(file);        if (!Modifier.isAbstract(clazz.getModifiers())) {            filter = (ZuulFilter) FILTER_FACTORY.newInstance(clazz);            // 为了下次Request使用filter,清空filter.filterType()类型的List
缓存,下次Request重新构建 List
list = hashFiltersByType.get(filter.filterType()); if (list != null) { hashFiltersByType.remove(filter.filterType()); //rebuild this list } // filterRegistry 管理所有的filter, filterRegistry.put(file.getAbsolutePath() + file.getName(), filter); // 记录filter文件更新时间。 filterClassLastModified.put(sName, file.lastModified()); return true; } } return false; }

这里主要的逻辑是把Groovy源码进行编译并加载进jvm里。

FilterRegistry

用于管理加载的filter,比较简单,使用 

ConcurrentHashMap<String, ZuulFilter> filters,启动key为filter的name:file.getAbsolutePath() + file.getName();

DynamicCodeCompiler

是一个接口,定义两种加载编译源码的方法:

/**        方法最后返回的是Class,即源码编译成字节码后,还要加载。        需要支持热加载,文件变化更新等。     */    Class compile(String sCode, String sName) throws Exception;    Class compile(File file) throws Exception;

总结

zuul整体框架比较简单,如果要实现API-Gateway,或者client-api adapter code,可以参考下。框架背后的思想也许更值得我们参考。

参考

转载于:https://my.oschina.net/voole/blog/886472

你可能感兴趣的文章
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
在ASP.NET MVC 中获取当前URL、controller、action
查看>>
Spring IoC容器初的初始化过程
查看>>
(23/24) webpack实战技巧:如何在webpack环境中使用Json
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
2-14
查看>>
swift-UITableView的基本使用(例子)
查看>>
自动化测试之WatiN(2)
查看>>
文件方式实现完整的英文词频统计实例
查看>>
Oracle活动会话历史(ASH)及报告解读
查看>>
Project Euler Problem 7: 10001st prime
查看>>
HDU1113 POJ1318 UVA642 ZOJ1181 UVALive5328 Word Amalgamation【MAP+排序】
查看>>
python制作验证码
查看>>
Java Thread(一) Outline
查看>>
谈一谈AGP
查看>>
Xamarin安装和跳坑指南
查看>>
MVVM架构~knockoutjs系列之文本框数符长度动态统计功能
查看>>