引言
在前一篇GlobalFilter中剖析了gateway的全局過濾器的設計與實現(xiàn);全局過濾器是針對于網關而言通用的功能組件實現(xiàn)荸镊,采用全局來實現(xiàn)便监。而對于有些非通用的功能或者面向用戶自定義的功能采用全局過濾器實現(xiàn)顯然是不合理的局装,基于此出發(fā)開源作者變換了思路驼唱,采用工廠模式來即時生產一個自定義或者配置的過濾器來過濾當前的請求。
自上而下分析
gateway聲明了一個工廠接口GatewayFilterFactory凸郑,此接口繼承了ShortcutConfigurable裳食,Configurable接口。默認不支持Configurable接口的操作芙沥,需要繼承AbstractNameValueGatewayFilterFactory才具備Configuable接口行為诲祸。
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宁炫。