spring-cloud-gateway之GatewayFilterFactory

引言

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

工廠接口與工廠類依賴圖

自上而下分析

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

GatewayFilterFactory

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

FunctionalInterface函數式接口聲明注解,將GatewayFilterFactory聲明為一個函數式接口。

ShortcutConfigurable是gateway實現的一個支持工具類,用于參數解析。包含兩個枚舉實現類,DEFAULT和GATHER_LIST,gateway默認使用的DEFAULT;RouteDefinitionRouteLocator#lookup方法中解析斷言參數時使用了此枚舉解析;在RouteDefinitionRouteLocator#loadGatewayFilters方法中加載配置過濾器時也使用此枚舉解析。

AbstractGatewayFilterFactory是GatewayFilterFactory接口的直接抽象實現類,作者意圖在于實現擴展性,并且標明是一個會被release的類。

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

AbstractChangeRequestUriGatewayFilterFactory是AbstractGatewayFilterFactory的另一個抽象子類,泛型參數與AbstractGatewayFilterFactory一致,只有一個參數名,實現類目前只有RequestHeaderToRequestUriGatewayFilterFactory。

過濾器工廠類分析

  • AddRequestHeaderGatewayFilterFactory
    在request header中添加一個鍵值對的header參數。

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

  • AddResponseHeaderGatewayFilterFactory
    在response header中添加一個鍵值對的header參數。

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

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


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

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

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


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


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

  • RemoveResponseHeaderGatewayFilterFactory
    與AddResponseHeaderGatewayFilterFactory呼應,刪除response header中的指定參數。

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

  • RequestRateLimiterGatewayFilterFactory
    流量限制過濾器,這個實現比較復雜的,基于redis + lua script實現的。


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

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


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

  • RewriteResponseHeaderGatewayFilterFactory
    重寫response中指定的header參數。

  • 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,所有的過濾器工廠實現類均在GatewayAutoConfiguration中進行注入BeanFactory中,根據每個路由配置的具體gatewayFilter從beanFactory中獲取工廠類進行配置并注入對應的RouteLocator;GatewayFilter和GlobalFilter一樣最終被封裝成OrderedGatewayFilter,然后為每個請求分配一個定制的GatewayFilterChain。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容