`
wx1568905209
  • 浏览: 25171 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

理解Spring Cloud Gateway Filters的执行顺序

 
阅读更多

本文基于Spring Cloud Gateway 2.1.1.RELEASE。

在讲SCG的Filter的排序问题之前得先比较一下Spring Cloud Gateway在对待Filter的方面与Zuul2有着哪些不同。

Filter的Scope

  • 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

上面的StripPrefixRemoveRequestHeader就是Route Filter,而SCG的Global Filter则是隐式的,无需显式配置,它们会在请求过来的时候被SCG调用。

也就是说你可以配置不同的Route,然后为每个Route配置不同的Route Filter,这一切都是在配置阶段就决定下来的。

而Zuul2则都是Global Filter,因此你得运行时在每个Filter内部自己决定是否要干活,除此之外,发送到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;
  }
}

Filter的角色

  • 在SCG概念中只有一种Filter(撇开Global和Route的区别),它用代码来区分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里,你则得分别实现HttpInboundSyncFilterHttpOutboundSyncFilterProxyEndpoint不需要你自己实现。

SCG Filter的问题

SCG的优点很明显,它做了Zuul2不做的事情:

  1. 替你决定进来的请求转发到哪个Origin。在Zuul2里这个交给你自己来实现。
  2. 在配置上就决定了这个Route会应用哪些Filter。在Zuul2里这个交给你自己来判断。

但是随着对SCG的深入了解,发现了关于Filter的执行顺序存在一些坑,如果不了解清楚会容易出错。

Filter的排序

前面讲了,SCG在执行过程中Global Filter和Route Filter是一起执行的,那么它们的order是怎样的?

先来看看Global Filter,你可以访问/actuator/gateway/globalfilters(见文档)得到Global Filter的排序:

1620

那么如果你写了一个自定义 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的源代码

用一张图做总结:

1620

Filter的执行顺序

先看SCG文档3. How It Works中的这张图:

1620

这张图大概告诉你了SCG的调用过程,可以看到经过了一堆Filters,但是并没有告诉你Filter的执行顺序。然后在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.

也就是说意思如果这个Filter是Pre Filter,那么执行顺序和排序顺序相同,如果这个Filter是Post Filter则执行顺序和排序顺序相反。我整理了一下SCG自带GlobalFilter的执行顺序:

1620

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

总结

  • 执行某个Route的时候,SCG会将Global Filter和Route Filter结合起来并排序:
    • 没有给order的Global Filter则保持order为null去排序
    • 没有给order的Route Filter的order则从1开始,根据Route中定义的顺序给值
    • 排序逻辑见AnnotationAwareOrderComparator
  • 对于Pre Filter,执行顺序同排序顺序
  • 对于Post Filter,执行顺序与排序顺序相反
  • 如果你要自定义Global Filter,那么一般来说:
    • 自定义的Global Pre Filter要在Routing Filter之前执行
    • 自定义的Global Post Filter要在Routing Filter之后执行或者NettyWriteResponseFilter之后执行
  • 如果你要自定义Route Filter,那么一般来说:
    • 自定义Route Pre Filter要在ForwardPathFilterRouteToRequestUrlFilter之间,而且不需要实现Ordered接口或添加@Order注解
    • 自定义的Route Post Filter比较少见,放在Routing Filter或者NettyWriteResponseFilter之后执行

 

转载于:https://my.oschina.net/u/2277392/blog/3094883

分享到:
评论

相关推荐

    最新Spring Cloud Gateway 官方参考指南-中文版-3.x

    Spring Cloud Gateway 是一款基于Spring生态系统构建的API网关,它主要设计用于提供一种简单而...在理解和使用Spring Cloud Gateway时,了解其核心概念和工作原理至关重要,以便更好地实现API管理和微服务间的通信。

    springcloud gateway 全局过滤器统一签名判定.doc

    在Spring Cloud Gateway中,全局过滤器(Global Filter)是一种强大的机制,用于在请求路由到具体的服务之前或之后执行通用的处理逻辑。在这个场景中,我们关注的是如何利用全局过滤器来实现统一的签名验证,这在...

    SpringCloudGateway2.1使用手册中文版.rar

    在使用 SpringCloudGateway2.1 使用手册中文版时,你可以找到关于如何配置路由、使用过滤器、集成服务发现、安全设置等方面的详细指导。手册中应该会包含以下内容: 1. **快速入门**:介绍如何创建基本的 Spring ...

    SpringCloud.03.网关Gateway 配置文件

    在Spring Cloud生态体系中...通过理解并灵活运用这些配置,我们可以根据业务需求定制Spring Cloud Gateway,实现高效、安全的API网关管理。在实践中,不断调整和完善配置,可以有效提升微服务架构的稳定性和可维护性。

    SpringCloud-Gateway demo.rar

    这个“SpringCloud-Gateway demo.rar”文件很可能是包含了演示如何设置和使用 Spring Cloud Gateway 的一个示例项目。 在Spring Cloud Gateway中,核心概念有以下几点: 1. **路由(Route)**:路由是 Gateway 的...

    Spring Cloud GateWay 路由转发规则介绍详解

    Predicate(谓语、断言)是路由转发的判断条件,目前 SpringCloud Gateway 支持多种方式,常见如:Path、Query、Method、Header 等。Filter(过滤器)是路由转发请求时所经过的过滤逻辑,用于修改请求、响应内容。 ...

    springcloud zuul gateway 服务网关

    SpringCloud Zuul Gateway 服务网关是Spring Cloud生态系统中的一个重要组件,它主要负责微服务架构中的路由转发和过滤器功能。Zuul是Netflix开源的一个边缘服务,而Gateway则是Spring Cloud针对Zuul进行的升级版,...

    Spring Cloud Gateway.docx

    ### Spring Cloud Gateway 配置路由详解 #### 一、引言 随着微服务架构的兴起,API网关作为微服务架构的重要组成部分,扮演着至关重要的角色。它不仅可以提供统一的入口,还可以处理诸如身份验证、限流、路由等功能...

    详解Spring Cloud Gateway基于服务发现的默认路由规则

    Spring Cloud Gateway的功能包括基于Spring Framework 5、Project Reactor和Spring Boot 2.0动态路由、Predicates和Filters、集成Hystrix断路器、集成Spring Cloud DiscoveryClient、易于编写的Predicates和Filters...

    Spring Cloud Gateway全局异常处理的方法详解

    Spring Cloud Gateway全局异常处理的方法详解 Spring Cloud Gateway作为Spring Cloud生态系中的网关,旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。然而,在实际应用中,Spring Cloud Gateway中的...

    spring-cloud-gateway-example-master.zip

    《Spring Cloud Gateway实战详解》 在微服务架构中,API网关扮演着至关重要的角色,它作为客户端与各个微服务之间的桥梁,承担了路由转发、鉴权、限流、熔断等多种职责。Spring Cloud Gateway是Spring Cloud生态...

    springcloud处理文件上传

    在分布式系统中,Spring Cloud作为一个强大的微服务框架,提供了丰富的组件来解决各种问题。本话题主要探讨如何在Spring Cloud环境中处理文件上传,特别是在结合Feign和Zuul这两个组件时的实现方法。Feign是Spring ...

    Spring cloud gateway工作流程原理解析

    Spring Cloud Gateway 工作流程原理解析 Spring Cloud Gateway 是一种基于 Spring Boot 和 Spring ...本文对 Spring Cloud Gateway 工作流程的原理解析,旨在帮助读者更好地理解 Gateway 的工作机理和实现原理。

    springCloud+gateway+nacos

    而Spring Cloud Gateway作为Spring Cloud生态中的新一代API网关,扮演着关键角色。Nacos则是阿里巴巴开源的一款服务发现与配置管理工具,它在微服务架构中起到了核心作用。本文将详细介绍如何从零开始搭建Nacos、...

    SpringCloud Gateway 漏洞分析 (CVE-2022-22947).doc

    SpringCloud Gateway 漏洞分析 (CVE-2022-22947) SpringCloud Gateway 是 Spring 提供的微服务实现框架,其中包含网关、配置中心和注册中心等内容。网关是 SpringCloud Gateway 的核心组件之一,提供了统一的流量...

    spring boot+spring cloud视频教学下载全套

    spring boot+spring cloud视频教学下载全套。( ├1 公开课.avi ├10 4.6 Ribbon-3使用配置文件自定义Ribbon Client.avi ├11 4.7 Ribbon-4 Ribbon脱离Eureka使用.avi ├12 4.8 Feign-1 Feign的简介及基础使用.avi ...

    SpringCloud-Gateway

    过滤器是 Spring Cloud Gateway 的另一大特性,允许在请求被路由之前或之后执行自定义逻辑。过滤器可以用来修改请求或响应,例如添加、删除头信息,修改请求体,甚至实现认证、限流等功能。在配置中,我们可以指定...

    springcloud gateway

    **SpringCloud Gateway 深入解析** SpringCloud Gateway 是基于 Spring Framework 5、Spring Boot 2 和 Project ...通过深入理解和合理运用,我们可以更好地利用 SpringCloud Gateway 来提升服务治理的效率和质量。

    springcloud getaway 全局过滤器.doc

    在Spring Boot的配置文件(如`application.properties`或`application.yml`)中,我们可以使用`spring.cloud.gateway.global-filters`属性来注册自定义的全局过滤器。例如: ```properties spring.cloud.gateway...

    spring-cloud-gateway应用.rar

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 构建的现代微服务网关,它旨在提供一种简单而有效的方式来路由请求,并对服务进行过滤。在分布式系统中,网关作为客户端与后端服务之间的统一...

Global site tag (gtag.js) - Google Analytics