spring-cloud-gateway之GatewayFilterFactory

引言

在前一篇GlobalFilter中剖析了gateway的全局過濾器的設計與實現(xiàn);全局過濾器是針對于網關而言通用的功能組件實現(xiàn)荸镊,采用全局來實現(xiàn)便监。而對于有些非通用的功能或者面向用戶自定義的功能采用全局過濾器實現(xiàn)顯然是不合理的局装,基于此出發(fā)開源作者變換了思路驼唱,采用工廠模式來即時生產一個自定義或者配置的過濾器來過濾當前的請求。

工廠接口與工廠類依賴圖

自上而下分析

gateway聲明了一個工廠接口GatewayFilterFactory凸郑,此接口繼承了ShortcutConfigurable裳食,Configurable接口。默認不支持Configurable接口的操作芙沥,需要繼承AbstractNameValueGatewayFilterFactory才具備Configuable接口行為诲祸。

GatewayFilterFactory

Configurable接口是為了實現(xiàn)一些配置信息(key-value)的使用方便而聲明的一個interface,具體作用體現(xiàn)在AbstractNameValueGatewayFilterFactory的子類實現(xiàn)中而昨。

FunctionalInterface函數(shù)式接口聲明注解救氯,將GatewayFilterFactory聲明為一個函數(shù)式接口。

ShortcutConfigurable是gateway實現(xiàn)的一個支持工具類歌憨,用于參數(shù)解析着憨。包含兩個枚舉實現(xiàn)類,DEFAULT和GATHER_LIST务嫡,gateway默認使用的DEFAULT甲抖;RouteDefinitionRouteLocator#lookup方法中解析斷言參數(shù)時使用了此枚舉解析;在RouteDefinitionRouteLocator#loadGatewayFilters方法中加載配置過濾器時也使用此枚舉解析心铃。

AbstractGatewayFilterFactory是GatewayFilterFactory接口的直接抽象實現(xiàn)類准谚,作者意圖在于實現(xiàn)擴展性,并且標明是一個會被release的類去扣。

AbstractNameValueGatewayFilterFactory是AbstractGatewayFilterFactory的其中一個抽象子類柱衔,重點在于其泛型Config類是一個鍵值對類型的,被若干個鍵值對配置的子類繼承愉棱,如AddRequestHeaderGatewayFilterFactory等唆铐。

AbstractChangeRequestUriGatewayFilterFactory是AbstractGatewayFilterFactory的另一個抽象子類,泛型參數(shù)與AbstractGatewayFilterFactory一致羽氮,只有一個參數(shù)名或链,實現(xiàn)類目前只有RequestHeaderToRequestUriGatewayFilterFactory。

過濾器工廠類分析

  • AddRequestHeaderGatewayFilterFactory
    在request header中添加一個鍵值對的header參數(shù)档押。

  • AddRequestParameterGatewayFilterFactory
    在request query參數(shù)列表中添加一個查詢參數(shù)。

  • AddResponseHeaderGatewayFilterFactory
    在response header中添加一個鍵值對的header參數(shù)祈纯。

  • DedupeResponseHeaderGatewayFilterFactory
    刪除response header中重復的數(shù)據項令宿,分別有三種數(shù)據保留策略。

  • HystrixGatewayFilterFactory
    熔斷器腕窥,集成了Netflix開源的Hystrix框架熔斷功能粒没,為了避免服務在故障時引發(fā)級聯(lián)故障,通過Hystrix允許下游服務故障時提供熔斷返回或者請求轉發(fā)操作簇爆;主要轉發(fā)邏輯在RouteHystrixCommand中的resumeWithFallback函數(shù)中癞松。


  • FallbackHeadersGatewayFilterFactory
    熔斷操作引發(fā)原因爽撒,聲明熔斷異常類型,這在2.0.2之后的版本才支持响蓉。下圖是官方最新版本文檔說明中的截圖硕勿,從說明中可以明白可以為不同異常配置不同的熔斷路徑,并標明異常類型枫甲。

  • PrefixPathGatewayFilterFactory
    為請求的Uri添加一個前綴路徑源武,Restful Api經常以/api作為規(guī)范開頭路徑,則可以為客戶端自動添加此規(guī)范想幻,客戶端則無需遵循此規(guī)范粱栖。

  • PreserveHostHeaderGatewayFilterFactory
    此過濾器沒有參數(shù),配置一個聲明屬性即可脏毯,標明時候對請求Host進行驗證闹究,驗證操作不發(fā)生于此過濾器中。


  • RedirectToGatewayFilterFactory
    將配置所指定的域名請求重定向至所配置地址食店,并設置當前請求狀態(tài)碼為3XX跋核。


  • RemoveRequestHeaderGatewayFilterFactory
    這個與AddRequestHeaderGatewayFilterFactory呼應,只不過是刪除request header中指定的header參數(shù)叛买。

  • RemoveResponseHeaderGatewayFilterFactory
    與AddResponseHeaderGatewayFilterFactory呼應砂代,刪除response header中的指定參數(shù)。

  • RequestHeaderToRequestUriGatewayFilterFactory
    需要一個NameConfig參數(shù)(需要通過此參數(shù)在header中獲取header屬性值)率挣,只需要在配置文件中聲明開啟刻伊,前提需要在request header中存在配置參數(shù)名的header屬性存在;將當前請求的Uri替換成header中指定的Uri椒功;注意這個工廠類的apply方法在父類中捶箱,自身只重寫了determineRequestUri方法。

  • RequestRateLimiterGatewayFilterFactory
    流量限制過濾器动漾,這個實現(xiàn)比較復雜的丁屎,基于redis + lua script實現(xiàn)的。


  • RequestSizeGatewayFilterFactory
    限制請求體的大小旱眯,默認是5M晨川;這個工廠類也是在2.0.2版本之后加入的。

  • RetryGatewayFilterFactory
    重試機制删豺,可以配置指定重試的錯誤級別和方法類型共虑。


  • RewritePathGatewayFilterFactory
    重寫請求的Uri,配置參數(shù)需要遵循正則表達式的規(guī)則呀页。

  • RewriteResponseHeaderGatewayFilterFactory
    重寫response中指定的header參數(shù)妈拌。

  • SaveSessionGatewayFilterFactory
    緩存當前請求的Session,調用Web Server的方法緩存蓬蝶,這里是Http Server的動作尘分。

  • SecureHeadersGatewayFilterFactory
    為request header添加若干屬性猜惋。

  • SetPathGatewayFilterFactory
    替換Path斷言中的路徑。

  • SetRequestHeaderGatewayFilterFactory
    與AddRequestHeaderGatewayFilterFactory功能相似培愁,一個是全局替換著摔,一個是追加,某種情況下作用一致竭钝。

  • SetResponseHeaderGatewayFilterFactory
    與AddResponseHeaderGatewayFilterFactory功能相似梨撞,這里是設置,而AddResponseHeaderGatewayFilterFactory中是往已存在的header屬性集合中添加香罐,當header屬性為空時兩個作用是一樣的卧波。

  • SetStatusGatewayFilterFactory
    根據配置設置請求的返回狀態(tài)。

  • StripPrefixGatewayFilterFactory
    這個與PrefixPathGatewayFilterFactory類似庇茫,只不過是按照配置截掉Uri的部分path港粱。

Summary

gateway的過濾器工廠類不同于GlobalFilter,所有的過濾器工廠實現(xiàn)類均在GatewayAutoConfiguration中進行注入BeanFactory中旦签,根據每個路由配置的具體gatewayFilter從beanFactory中獲取工廠類進行配置并注入對應的RouteLocator查坪;GatewayFilter和GlobalFilter一樣最終被封裝成OrderedGatewayFilter,然后為每個請求分配一個定制的GatewayFilterChain宁炫。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末偿曙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羔巢,更是在濱河造成了極大的恐慌望忆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竿秆,死亡現(xiàn)場離奇詭異启摄,居然都是意外死亡,警方通過查閱死者的電腦和手機幽钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門歉备,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匪燕,你說我怎么就攤上這事蕾羊。” “怎么了谎懦?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵肚豺,是天一觀的道長。 經常有香客問我界拦,道長,這世上最難降的妖魔是什么梗劫? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任享甸,我火速辦了婚禮截碴,結果婚禮上,老公的妹妹穿的比我還像新娘蛉威。我一直安慰自己日丹,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布蚯嫌。 她就那樣靜靜地躺著哲虾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪择示。 梳的紋絲不亂的頭發(fā)上束凑,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音栅盲,去河邊找鬼汪诉。 笑死,一個胖子當著我的面吹牛谈秫,可吹牛的內容都是我干的扒寄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拟烫,長吁一口氣:“原來是場噩夢啊……” “哼该编!你這毒婦竟也來了?” 一聲冷哼從身側響起硕淑,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤课竣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喜颁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稠氮,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年半开,在試婚紗的時候發(fā)現(xiàn)自己被綠了隔披。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡寂拆,死狀恐怖奢米,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情纠永,我是刑警寧澤鬓长,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站尝江,受9級特大地震影響涉波,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一啤覆、第九天 我趴在偏房一處隱蔽的房頂上張望苍日。 院中可真熱鬧,春花似錦窗声、人聲如沸相恃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦耐。三九已至,卻和暖如春见剩,著一層夾襖步出監(jiān)牢的瞬間杀糯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工炮温, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留火脉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓柒啤,卻偏偏與公主長得像倦挂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子担巩,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容