zuul之過濾器Filter管理

目錄

概述

zuul通過FilterLoader類負責filter的管理杉允,是ZUUL的核心類之一揍障。它編譯坛芽、從文件加載,并檢查源代碼是否更改割择。它還包含按filterType的ZuulFilters。此類再如下兩處使用:

  1. zuul之請求處理流程:FilterProcessor 通過FilterLoader加載給定類型的過濾器列表
  2. 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)通過源碼學習分析完畢

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妈嘹,一起剝皮案震驚了整個濱河市柳琢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌润脸,老刑警劉巖柬脸,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毙驯,居然都是意外死亡倒堕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門爆价,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垦巴,“玉大人,你說我怎么就攤上這事铭段≈栊” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵序愚,是天一觀的道長憔披。 經(jīng)常有香客問我,道長爸吮,這世上最難降的妖魔是什么活逆? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮拗胜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怒允。我一直安慰自己埂软,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布纫事。 她就那樣靜靜地躺著勘畔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丽惶。 梳的紋絲不亂的頭發(fā)上炫七,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音钾唬,去河邊找鬼万哪。 笑死侠驯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奕巍。 我是一名探鬼主播吟策,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼的止!你這毒婦竟也來了檩坚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤诅福,失蹤者是張志新(化名)和其女友劉穎匾委,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氓润,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赂乐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旺芽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪猴。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖采章,靈堂內(nèi)的尸體忽然破棺而出运嗜,到底是詐尸還是另有隱情,我是刑警寧澤悯舟,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布担租,位于F島的核電站,受9級特大地震影響抵怎,放射性物質(zhì)發(fā)生泄漏奋救。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一反惕、第九天 我趴在偏房一處隱蔽的房頂上張望尝艘。 院中可真熱鬧,春花似錦姿染、人聲如沸背亥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狡汉。三九已至,卻和暖如春闽颇,著一層夾襖步出監(jiān)牢的瞬間盾戴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工兵多, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尖啡,地道東北人橄仆。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像可婶,于是被迫代替她去往敵國和親沿癞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349