這篇文章給大家介紹怎么理解Spring Cloud Gateway Filters的執(zhí)行順序,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
淶水ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
基于Spring Cloud Gateway 2.1.1.RELEASE。
在講SCG的Filter的排序問題之前得先比較一下Spring Cloud Gateway在對待Filter的方面與Zuul2有著哪些不同。
SCG采用的是Global Filter和Route Filter相結合的方式
Zuul2則都是Global Filter
SCG所謂Route Filter就是像下面這樣的:
spring: cloud: gateway: routes: - id: tomcat_route uri: http://tomcat:8080 predicates: - Path=/tomcat/docs filters: - StripPrefix=1 - RemoveRequestHeader=X-Request-Foo
上面的StripPrefix和RemoveRequestHeader就是Route Filter,而SCG的Global Filter則是隱式的,無需顯式配置,它們會在請求過來的時候被SCG調用。
也就是說你可以配置不同的Route,然后為每個Route配置不同的Route Filter,這一切都是在配置階段就決定下來的。
而Zuul2則都是Global Filter,因此你得運行時在每個Filter內部自己決定是否要干活,除此之外,發(fā)送到Origin(被代理的服務)的url也得你自己設置,下面是一個例子(來自Zuul2 Sample):
public class Routes extends HttpInboundSyncFilter {
  @Override
  public boolean shouldFilter(HttpRequestMessage httpRequestMessage) {
    // ...
    return true;
  }
  @Override
  public HttpRequestMessage apply(HttpRequestMessage request) {
    // ...
    // Route healthchecks to the healthcheck endpoint.;
    context.setEndpoint(ZuulEndPointRunner.PROXY_ENDPOINT_FILTER_NAME);
    context.setRouteVIP("tomcat");
    return request;
  }
}在SCG概念中只有一種Filter(撇開Global和Route的區(qū)別),它用代碼來區(qū)分Pre Filter、Post Filter。在文檔中還提到了Routing Filter,其實也是Pre Filter。
Zuul2在代碼中顯示得提供了InboundFilter(負責進來的請求)、OutboundFilter(負責出去的響應)、ProxyEndpoint(負責請求到Origin,串起Inbound和Outbound)。
下面是SCG的Pre Filter(裁剪自官方例子12.2 Writing Custom GatewayFilter Factories):
public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory {
    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // business logic
            return chain.filter();
        };
    }
}Post Filter的例子:
public class PostGatewayFilterFactory extends AbstractGatewayFilterFactory {
    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            return chain.filter(exchange).then(/* business logic */);
        };
    }
}在Zuul2里,你則得分別實現HttpInboundSyncFilter和HttpOutboundSyncFilter,ProxyEndpoint不需要你自己實現。
SCG的優(yōu)點很明顯,它做了Zuul2不做的事情:
替你決定進來的請求轉發(fā)到哪個Origin。在Zuul2里這個交給你自己來實現。
在配置上就決定了這個Route會應用哪些Filter。在Zuul2里這個交給你自己來判斷。
但是隨著對SCG的深入了解,發(fā)現了關于Filter的執(zhí)行順序存在一些坑,如果不了解清楚會容易出錯。
前面講了,SCG在執(zhí)行過程中Global Filter和Route Filter是一起執(zhí)行的,那么它們的order是怎樣的?
先來看看Global Filter,你可以訪問/actuator/gateway/globalfilters(見文檔)得到Global Filter的排序:

那么如果你寫了一個自定義 Global Filter,那么它的order是什么呢?這個要看情況:
如果你的自定義Global Filter實現了Ordered接口或者寫了@Order注解,那么它的order就是它自己設定的值
否則,它就沒有order
關于這點可以看FilteringWebHandler.java的源代碼。
再來看看Route Filter,這也分兩種情況:
如果RouteFilter實現了Ordered接口或者寫了@Order注解,那么它的order就是它自己設定的值。
否則,它的order則是從1開始,按照Route中定義的順序依次排序。
關于這點可以看RouteDefinitionRouteLocator.java的源代碼。
最后SCG把它們兩個結合起來,做一個排序,對于沒有order的Filter,它的order則默認為Ordered.LOWEST_PRECEDENCE。關于這點可以看FilteringWebHandler.java的源代碼。
用一張圖做總結:

先看SCG文檔3. How It Works中的這張圖:

這張圖大概告訴你了SCG的調用過程,可以看到經過了一堆Filters,但是并沒有告訴你Filter的執(zhí)行順序。然后在SCG的6.1 Combined Global Filter and GatewayFilter Ordering提到了:
As Spring Cloud Gateway distinguishes between "pre">
也就是說意思如果這個Filter是Pre Filter,那么執(zhí)行順序和排序順序相同,如果這個Filter是Post Filter則執(zhí)行順序和排序順序相反。我整理了一下SCG自帶GlobalFilter的執(zhí)行順序:

可以看到GatewayMetricsFilter既是Pre Filter也是Post Filter。
執(zhí)行某個Route的時候,SCG會將Global Filter和Route Filter結合起來并排序:
沒有給order的Global Filter則保持order為null去排序
沒有給order的Route Filter的order則從1開始,根據Route中定義的順序給值
排序邏輯見AnnotationAwareOrderComparator
對于Pre Filter,執(zhí)行順序同排序順序
對于Post Filter,執(zhí)行順序與排序順序相反
如果你要自定義Global Filter,那么一般來說:
自定義的Global Pre Filter要在Routing Filter之前執(zhí)行
自定義的Global Post Filter要在Routing Filter之后執(zhí)行或者NettyWriteResponseFilter之后執(zhí)行
如果你要自定義Route Filter,那么一般來說:
自定義Route Pre Filter要在ForwardPathFilter和RouteToRequestUrlFilter之間,而且不需要實現Ordered接口或添加@Order注解
自定義的Route Post Filter比較少見,放在Routing Filter或者NettyWriteResponseFilter之后執(zhí)行
關于怎么理解Spring Cloud Gateway Filters的執(zhí)行順序就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
                分享名稱:怎么理解SpringCloudGatewayFilters的執(zhí)行順序
                
                文章出自:http://chinadenli.net/article4/pgpgie.html
            
成都網站建設公司_創(chuàng)新互聯,為您提供面包屑導航、全網營銷推廣、標簽優(yōu)化、做網站、網頁設計公司、關鍵詞優(yōu)化
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯