成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解Spring Cloud Gateway Filters的執(zhí)行順序

Kahn / 818人閱讀

摘要:在代碼中顯示得提供了負(fù)責(zé)進(jìn)來的請(qǐng)求負(fù)責(zé)出去的響應(yīng)負(fù)責(zé)請(qǐng)求到,串起和。但是隨著對(duì)的深入了解,發(fā)現(xiàn)了關(guān)于的執(zhí)行順序存在一些坑,如果不了解清楚會(huì)容易出錯(cuò)。否則,它的則是從開始,按照中定義的順序依次排序。我整理了一下自帶的執(zhí)行順序可以看到既是也是。

本文基于Spring Cloud Gateway 2.1.1.RELEASE。

在講SCG的Filter的排序問題之前得先比較一下Spring Cloud Gateway在對(duì)待Filter的方面與Zuul2有著哪些不同。

Filter的Scope

SCG采用的是Global Filter和Route Filter相結(jié)合的方式

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

上面的StripPrefixRemoveRequestHeader就是Route Filter,而SCG的Global Filter則是隱式的,無需顯式配置,它們會(huì)在請(qǐng)求過來的時(shí)候被SCG調(diào)用。

也就是說你可以配置不同的Route,然后為每個(gè)Route配置不同的Route Filter,這一切都是在配置階段就決定下來的。

而Zuul2則都是Global Filter,因此你得運(yùn)行時(shí)在每個(gè)Filter內(nèi)部自己決定是否要干活,除此之外,發(fā)送到Origin(被代理的服務(wù))的url也得你自己設(shè)置,下面是一個(gè)例子(來自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;
  }
}
Filter的角色

在SCG概念中只有一種Filter(撇開Global和Route的區(qū)別),它用代碼來區(qū)分Pre Filter、Post Filter。在文檔中還提到了Routing Filter,其實(shí)也是Pre Filter。

Zuul2在代碼中顯示得提供了InboundFilter(負(fù)責(zé)進(jìn)來的請(qǐng)求)、OutboundFilter(負(fù)責(zé)出去的響應(yīng))、ProxyEndpoint(負(fù)責(zé)請(qǐng)求到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里,你則得分別實(shí)現(xiàn)HttpInboundSyncFilterHttpOutboundSyncFilter,ProxyEndpoint不需要你自己實(shí)現(xiàn)。

SCG Filter的問題

SCG的優(yōu)點(diǎn)很明顯,它做了Zuul2不做的事情:

替你決定進(jìn)來的請(qǐng)求轉(zhuǎn)發(fā)到哪個(gè)Origin。在Zuul2里這個(gè)交給你自己來實(shí)現(xiàn)。

在配置上就決定了這個(gè)Route會(huì)應(yīng)用哪些Filter。在Zuul2里這個(gè)交給你自己來判斷。

但是隨著對(duì)SCG的深入了解,發(fā)現(xiàn)了關(guān)于Filter的執(zhí)行順序存在一些坑,如果不了解清楚會(huì)容易出錯(cuò)。

Filter的排序

前面講了,SCG在執(zhí)行過程中Global Filter和Route Filter是一起執(zhí)行的,那么它們的order是怎樣的?

先來看看Global Filter,你可以訪問/actuator/gateway/globalfilters(見文檔)得到Global Filter的排序:

那么如果你寫了一個(gè)自定義 Global Filter,那么它的order是什么呢?這個(gè)要看情況:

如果你的自定義Global Filter實(shí)現(xiàn)了Ordered接口或者寫了@Order注解,那么它的order就是它自己設(shè)定的值

否則,它就沒有order

關(guān)于這點(diǎn)可以看FilteringWebHandler.java的源代碼。

再來看看Route Filter,這也分兩種情況:

如果RouteFilter實(shí)現(xiàn)了Ordered接口或者寫了@Order注解,那么它的order就是它自己設(shè)定的值。

否則,它的order則是從1開始,按照Route中定義的順序依次排序。

關(guān)于這點(diǎn)可以看RouteDefinitionRouteLocator.java的源代碼。

最后SCG把它們兩個(gè)結(jié)合起來,做一個(gè)排序,對(duì)于沒有order的Filter,它的order則默認(rèn)為Ordered.LOWEST_PRECEDENCE。關(guān)于這點(diǎn)可以看FilteringWebHandler.java的源代碼。

用一張圖做總結(jié):

Filter的執(zhí)行順序

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

這張圖大概告訴你了SCG的調(diào)用過程,可以看到經(jīng)過了一堆Filters,但是并沒有告訴你Filter的執(zhí)行順序。然后在SCG的6.1 Combined Global Filter and GatewayFilter Ordering提到了:

As Spring Cloud Gateway distinguishes between "pre" and "post" phases for filter logic execution (see: How It Works), the filter with the highest precedence will be the first in the "pre"-phase and the last in the "post"-phase.

也就是說意思如果這個(gè)Filter是Pre Filter,那么執(zhí)行順序和排序順序相同,如果這個(gè)Filter是Post Filter則執(zhí)行順序和排序順序相反。我整理了一下SCG自帶GlobalFilter的執(zhí)行順序:

可以看到GatewayMetricsFilter既是Pre Filter也是Post Filter。

總結(jié)

執(zhí)行某個(gè)Route的時(shí)候,SCG會(huì)將Global Filter和Route Filter結(jié)合起來并排序:

沒有給order的Global Filter則保持order為null去排序

沒有給order的Route Filter的order則從1開始,根據(jù)Route中定義的順序給值

排序邏輯見AnnotationAwareOrderComparator

對(duì)于Pre Filter,執(zhí)行順序同排序順序

對(duì)于Post Filter,執(zhí)行順序與排序順序相反

如果你要自定義Global Filter,那么一般來說:

自定義的Global Pre Filter要在Routing Filter之前執(zhí)行

自定義的Global Post Filter要在Routing Filter之后執(zhí)行或者NettyWriteResponseFilter之后執(zhí)行

如果你要自定義Route Filter,那么一般來說:

自定義Route Pre Filter要在ForwardPathFilterRouteToRequestUrlFilter之間,而且不需要實(shí)現(xiàn)Ordered接口或添加@Order注解

自定義的Route Post Filter比較少見,放在Routing Filter或者NettyWriteResponseFilter之后執(zhí)行

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74243.html

相關(guān)文章

  • Spring Cloud Gateway實(shí)戰(zhàn)之五:內(nèi)置filter

    摘要:歡迎訪問我的歡迎訪問我的內(nèi)容所有原創(chuàng)文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽作為實(shí)戰(zhàn)系列的第五篇,是時(shí)候了解過濾器的作用了,本篇咱們一起來了解內(nèi)置好的過濾器,真是種類繁多功能強(qiáng)大過濾器顧名思義,就是在請(qǐng)求頭部添加指定的內(nèi)容帶有的完整配歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Doc...

    reclay 評(píng)論0 收藏0
  • spring cloud gateway 源碼解析(1)整體流程

    摘要:公司要做自己的網(wǎng)關(guān),于是先把的過了一遍,然后把源碼在看了一遍,這樣公司的需求就搞定了。包括動(dòng)態(tài)路由,多緯度限流,記錄請(qǐng)求參數(shù)及返回參數(shù)也可修改。至此,流程就走完了。 公司要做自己的網(wǎng)關(guān),于是先把github的issue過了一遍,然后把gateway源碼在看了一遍,這樣公司的需求就搞定了。包括動(dòng)態(tài)路由,多緯度限流,記錄請(qǐng)求參數(shù)及返回參數(shù)(也可修改)。先從請(qǐng)求進(jìn)入網(wǎng)關(guān)說起吧: 請(qǐng)求先進(jìn)...

    miqt 評(píng)論0 收藏0
  • Spring Cloud Gateway 之 AddRequestHeader GatewayFil

    摘要:類似的工廠類還有和,,,這幾個(gè)就不做單獨(dú)講解了,使用方式是一樣的。配置示列配置示列討論時(shí)間文章中講的這幾個(gè)工廠類的作用我們已經(jīng)了解了,那具體的使用場(chǎng)景有哪些適合在什么場(chǎng)景下使用呢歡迎大家留言討論。 今天我們來學(xué)習(xí)下GatewayFilter Factory,中文解釋就是過濾器工廠。 官方文檔對(duì)GatewayFilter Factory的介紹: Route filters allow t...

    宋華 評(píng)論0 收藏0
  • Spring Cloud Gateway修改請(qǐng)求和響應(yīng)body內(nèi)容

    摘要:歡迎訪問我的歡迎訪問我的內(nèi)容所有原創(chuàng)文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽作為實(shí)戰(zhàn)系列的第九篇,咱們聊聊如何用修改原始請(qǐng)求和響應(yīng)內(nèi)容,以及修改過程中遇到的問題首先是修改請(qǐng)求,如下圖,瀏覽器是請(qǐng)求發(fā)起方,真實(shí)參數(shù)只有,經(jīng)過網(wǎng)關(guān)時(shí)被塞歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Dock...

    ivyzhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<