目錄
概述
zuul通過FilterLoader類負責filter的管理杉允,是ZUUL的核心類之一揍障。它編譯坛芽、從文件加載,并檢查源代碼是否更改割择。它還包含按filterType的ZuulFilters。此類再如下兩處使用:
- zuul之請求處理流程:FilterProcessor 通過FilterLoader加載給定類型的過濾器列表
- zuul之動態(tài)過濾器Filter類文件管理加載:調(diào)用processGroovyFiles方法遍歷filter列表通過FilterLoader類處理加載Filter
FilterLoader
- 根據(jù)過濾器類型獲取過濾器列表
FilterLoader 中緩存了所有過濾器的集合例诀,可以根據(jù)過濾器的類型獲取對應的過濾器列表
public List<ZuulFilter> getFiltersByType(String filterType) {
//在緩存中獲取當前類型的過濾器列表
List<ZuulFilter> list = hashFiltersByType.get(filterType);
if (list != null) return list;
list = new ArrayList<ZuulFilter>();
//通過filterRegistry獲取所有過濾器
Collection<ZuulFilter> filters = filterRegistry.getAllFilters();
//遍歷篩選過濾器獲取給定的列表
for (Iterator<ZuulFilter> iterator = filters.iterator(); iterator.hasNext(); ) {
ZuulFilter filter = iterator.next();
if (filter.filterType().equals(filterType)) {
list.add(filter);
}
}
//排序過濾器列表
Collections.sort(list); // sort by priority
//添加到緩存中
hashFiltersByType.putIfAbsent(filterType, list);
return list;
}
getFiltersByType
- 在緩存中查找給定的類型列表
- 當前緩存為空時泛烙,通過全部過濾器列表緩存遍歷組裝給定類型的列表并緩存返回
- 通過過濾器源碼加載編譯過濾器并緩存
public boolean putFilter(File file) throws Exception {
// 獲取類文件的全名
String sName = file.getAbsolutePath() + file.getName();
//校驗類文件是否修改過理卑,根據(jù)類文件的最后修改時間判斷
if (filterClassLastModified.get(sName) != null && (file.lastModified() != filterClassLastModified.get(sName))) {
// 類文件修改過時,刪除全局緩存中當前過濾器的信息
LOG.debug("reloading filter " + sName);
filterRegistry.remove(sName);
}
//在全局緩存中判斷是否存在當前過濾器
ZuulFilter filter = filterRegistry.get(sName);
if (filter == null) {
//緩存中無當前要加載的過濾器時蔽氨,編譯當前類文件
Class clazz = COMPILER.compile(file);
if (!Modifier.isAbstract(clazz.getModifiers())) {
// 反射創(chuàng)建通過class創(chuàng)建過濾器對象
filter = (ZuulFilter) FILTER_FACTORY.newInstance(clazz);
//緩存當前過濾器對象
List<ZuulFilter> list = hashFiltersByType.get(filter.filterType());
if (list != null) {
hashFiltersByType.remove(filter.filterType()); //rebuild this list
}
//全局緩存當前過濾器對象 filterRegistry.put(file.getAbsolutePath() + file.getName(), filter);
filterClassLastModified.put(sName, file.lastModified());
return true;
}
}
return false;
}
putFilter
校驗給定的類文件是否變更過藐唠,變更過帆疟,刪除舊緩存信息,編譯新源文件并反射創(chuàng)建對象緩存到系統(tǒng)的全局緩存中
FilterLoader主要完成了上述兩個功能宇立,一個為請求進來獲取過濾器列表服務(wù)踪宠,一個為動態(tài)加載變更過濾器服務(wù)。至此 zuul的核心功能已經(jīng)通過源碼學習分析完畢