Spring Cloud Gateway 过滤器详解

这篇具有很好参考价值的文章主要介绍了Spring Cloud Gateway 过滤器详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

Spring Cloud Gateway根据作用范围划分为:GatewayFilter和GlobalFilter

1、filter的作用和生命周期

由filter工作流程点,可以知道filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等

作用

网关过滤器用于拦截并链式处理Web请求,可以实现横切与应用无关的需求,比如:鉴权、限流、日志输出等

生命周期

Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如上图中的user-service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。filter从作用范围可分为另外两种,一种是针对于单个路由的gateway filter,它在配置文件中的写法同predict类似;另外一种是针对于所有路由的global gateway filer

 二、网关过滤器 GatewayFilter

过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器可以限定作用在某些特定请求路径上。可以实现横切与应用无关的需求,比如:安全、访问超时的设置等。修改传入的HTTP请求或传出HTTP响应。Spring Cloud Gateway 包含许多内置的网关过滤器工厂,一共22个。包括头部过滤器、路径过滤器、Hystrix过滤器和重写请求URL的过滤器,还有参数和状态码等其他类型的过滤器。根据过滤器工程的用途来划分,可以分为以下几种:Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter 和 Hystrix。 Spring Cloud Gateway包含许多内置的GatewayFilter工厂。

GatewayFilter工厂同上一篇介绍的Predicate工厂类似,都是在配置文件application.yml中配置,遵循了约定大于配置的思想,只需要在配置文件配置GatewayFilter Factory的名称,而不需要写全部的类名,比如AddRequestHeaderGatewayFilterFactory只需要在配置文件中写AddRequestHeader,而不是全部类名。在配置文件中配置的GatewayFilter Factory最终都会相应的过滤器工厂类处理。

1、AddRequestHeader

描述

1、用于向下游服务 添加 请求头,
2、支持 uri variables

参数

1、name:向下游服务传递请求头的 key
2、value:向下游服务传递请求头的 value

示例

1、方式一、添加一个固定的请求头

spring:
  cloud:
    nacos:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddRequestHeader=x-token,xxxxx

表示会向下游服务传递一个 x-token 的请求头,值是 xxxxx

2、配合 uri variables 添加动态请求头

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-02
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne/{productId}
          filters:
            - AddRequestHeader=x-token,xxxxx-{productId}

表示会向下游服务传递一个 x-token 的请求头,值是 xxxxx-匹配上的productId的值

2、AddRequestParameter

描述

用于向下游服务 添加一个请求参数

参数

name:添加的参数 key
value:添加的参数 value,可以支持 Path或Host 中的 uri variables

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddRequestParameter=username,zhangsan

向下游服务增加一个 username = zhangsan 的请求参数

3、AddResponseHeader

描述

向下游的响应中增加一个 响应头。

参数

1、name:添加的响应头的 key
2、value:添加的响应头的 value,可以支持 Path或Host 中的 uri variables

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddResponseHeader=encryption,false

向下游服务响应增加一个 encryption = false 的响应头

4、DedupeResponseHeader

描述

移除重复的请求头

参数

1、name:需要移除的重复的响应头,多个以 空格 分隔
2、strategy:重复时,移除的策略,默认是RETAIN_FIRST,即保留第一个头

  1. RETAIN_FIRST:保留第一个值
  2. RETAIN_LAST:保留最后一个值
  3. RETAIN_UNIQUE:保留所有的不重复的值

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - DedupeResponseHeader=x-token Access-Control-Allow-Credentials Access-Control-Allow-Origin,RETAIN_FIRST

移除上方指定的重复的响应头,并且保留第一个出现的。

5、MapRequestHeader

描述

fromHeader 参数的值 追加到 toHeader 参数中。

  1. fromHeader 在 header 中不存在,那么没有什么影响。
  2. fromHeader 存在
  3.  toHeader 存在,那么往配置中 toHeader 对应的 header 中追加 fromHeader对应的值 
    
  4. toHeader 不存在,那么往 header 中增加一个header ,key: 配置中的toHeader的值,value: fromHeader 在header中的值
    

参数

1、fromHeader:从请求参数中获取header的值
2、toHeader:向header中设置一个 header, key是toheader的值,value 是 fromHeader的值

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - MapRequestHeader=from-header,x-token

即会向 request 中增加一个 key 为 x-token 的header ,值为 header 中 from-header 对应的值。(存在多种情况,参考描述

6、Prefix

描述

为匹配到的路由,在转发到下游服务时,增加一个前缀prefix

参数

1、prefix:需要增加的路径前缀

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/findOne
          filters:
            - PrefixPath=/product

访问 http://网关ip:port/findOne ⇒ 转发到下游服务地址 http://product-provider/product/findOne 增加了一个前缀。

7、PreserveHostHeader

描述

它表示在Spring Cloud Gateway转发请求的时候,保持客户端的Host信息不变,然后将它传递到下游服务器中。

参数

没有参数

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - PreserveHostHeader

8、RemoveRequestHeader

描述

移除请求头中的参数

参数

1、name:需要移除的请求头

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveRequestHeader=x-token

9、RemoveResponseHeader

描述

移除响应头

参数

1、name:需要移除的响应头

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveResponseHeader=x-token

9、RemoveRequestParameter

描述

移除请求参数,往下游服务传递时,此参数就没有来

参数

1、name:需要移除的请求参数

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveRequestParameter=password

10、RewritePath

描述

根据正则表达式,执行路径重写

参数

1、regexp:匹配的正则表达式
2、replacement:需要替换成的字符串
注意:
1、在yml配置中 $ 需要写成 $\
2、路径替换规则是: path.replaceAll(regexp,replacement)

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/admin/product/findOne
          filters:
            - RewritePath=/admin(?<segment>/?.*), $\{segment} # 当访问/admin/product/findOne 将会替换成 /product/findOne

页面上访问 /admin/product/findOne ⇒ 到达下游服务的路径是 /product/findOne

11、StripPrefix

描述

移除路径前缀,比如访问: /admin/aa/bb/cc 实际的下游服务器地址是 /bb/cc 则可以使用这个实现

参数

1、parts:请求的路径按照/分隔后,需要跳过的部分,从1开始。

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/admin/product/findOne
          filters:
            - StripPrefix=1 # 当访问/admin/product/findOne 将会替换成 /product/findOne

页面上访问 /admin/product/findOne ⇒ 到达下游服务的路径是 /product/findOne

12、RequestSize

描述

配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large

参数

1、maxSize:请求体的大小

示例

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - name: RequestSize
              args:
                maxSize: 1B

此处需要通过 filters[index].args.maxSize 配置,否则不生效。

13、ModifyRequestBody

描述

修改传递到下游服务 RequestBody 的值,比如我们所有的经过网关的服务,到达下游服务时,都需要将 用户当前的用户名和数据权限传递下去,此时就可以使用这个。

需求:

修改原始服务的参数,增加usernameroles参数传递到下游服务。

路由配置,只可通过 Java 代码来配置

@Configuration
public class RouteConfig {

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("product-provider", predicateSpec -> predicateSpec.path("/product/modifyRequestBody")
                        .filters(gatewayFilterSpec -> gatewayFilterSpec.modifyRequestBody(String.class, Map.class, MediaType.APPLICATION_JSON_VALUE, (exchange, s) -> {
                            Map<String, Object> params = new HashMap<>(16);
                            params.put("old", s);
                            params.put("username", "v_huan");
                            params.put("roles", "ROLE_ADMIN");
                            return Mono.just(params);
                        })).uri("lb://product-provider")).build();
    }
}

三、全局过滤器

   全局过滤器不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它是请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

当某个请求被路由匹配时,那么所有的全局过滤器(GlobalFilter)和路由匹配到的 GatewayFilter会组合成一个过滤器链,排序规则是通过 Spring 的 Ordered 来排序。
GlobalFilter有pre和post2个执行阶段,优先级越高 pre 阶段执行越早, post阶段执行越迟。
编写一个全局过滤器需要实现 GlobalFilter 接口

下面这些是Gateway内置的全局过滤器,已经在所有路由生效
 Spring Cloud Gateway 过滤器详解

Spring Cloud Gateway根据作用范围划分为GatewayFilter和GlobalFilter,二者区别如下:

  • GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过spring.cloud.default-filters配置在全局,作用在所有路由上
  • GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。

📢文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗ 

   Spring Cloud Gateway文章来源地址https://www.toymoban.com/news/detail-401331.html

到了这里,关于Spring Cloud Gateway 过滤器详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud Gateway快速入门(三)——过滤器

    Gateway过滤器是Spring Cloud Gateway提供的一种机制,用于对进入网关的请求和返回进行处理和转换。它可以用于实现各种功能,如请求鉴权、请求转发、请求限流、请求重试等。 网关过滤器是Spring Cloud Gateway提供的一种机制,用于在请求进入网关和响应离开网关时进行一些预处理

    2024年02月04日
    浏览(47)
  • Spring Cloud Gateway 过滤器 StripPrefix=1 的作用

    StripPrefix=1 是 Spring Gateway 中的一个过滤器,它用于去除请求的前缀路径。 当配置了 StripPrefix=1 过滤器后,如果请求的路径中存在前缀路径,该过滤器将会去除指定数量的前缀路径。具体而言,StripPrefix=1 表示去除请求路径的第一个路径片段(即前缀路径)。 例如,假设你的路

    2024年02月04日
    浏览(45)
  • Spring Cloud Gateway内置的断言和过滤器作用

    对应版本3.1.7对应SpringCloud版本2021.0.7 AfterRoutePredicateFactory 作用:判断当请求时间是否在指定配置时间之后 使用方式 使用场景:当上线一新服务时在未来某个时间提供服务 两种配置方式的区别: 第一种便捷方式配置的值是按逗号分隔,再按shortcutFieldOrder方法返回的字段顺序

    2024年02月06日
    浏览(49)
  • Spring-Cloud-Gateway如何自定义路由过滤器?

    遇到这么一个面试题:自定义网关过滤器实现把url中的请求参数放到http的header中传递给微服务。 我们知道网关的一个重要的作用就是路由转发,路由表的配置大概是这个样子: 其中的filters就是配置的路由过滤器,Spring已经内置了31个路由的过滤器,这些过滤器都是 org.spring

    2024年02月16日
    浏览(40)
  • 【Spring Cloud】深入探索统一网关 Gateway 的搭建,断言工厂,过滤器工厂,全局过滤器以及跨域问题

    在微服务架构中,网关是至关重要的组件,具有多重职责,为整个系统提供了一系列关键功能。从下面的微服务结构图中,我们可以明确网关的几项主要作用: 微服务结构图: 请求过滤与安全: 用户的所有请求首先经过网关,这使得网关成为系统的第一道防线。通过对传入

    2024年02月07日
    浏览(57)
  • 从Spring Cloud Gateway过滤器中获取请求体的最优方案

    在spring cloud gateway出现这个问题的时候我们第一反应应该很简单,但是真正实现的时候却有点困难。我看了很多相关的文档,感觉太多都不清晰而且解决不了问题。下面我就把我的方便理解的解决方案写下来。 1. 先重写请求体(过滤器优先级一定要在要获取body之前执行) 这

    2024年02月16日
    浏览(46)
  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

    2024年02月14日
    浏览(67)
  • gateway之过滤器(Filter)详解

    在Spring Cloud中,过滤器(Filter)是一种关键的组件,用于在微服务架构中处理和转换传入请求以及传出响应。过滤器位于服务网关或代理中,并通过拦截请求和响应流量来提供各种功能。 过滤器在请求的不同生命周期阶段执行特定的操作,例如鉴权、认证、请求转发、限流、

    2024年02月05日
    浏览(44)
  • 网关 GateWay 的使用详解、路由、过滤器、跨域配置!

    SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中提供的WebFlux,是一种响应式编程的实现,性能更加优越。 Zuul的实现方式比较老式

    2024年02月07日
    浏览(60)
  • 网关 GateWay 的使用详解、路由、过滤器、跨域配置

    SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中提供的WebFlux,是一种响应式编程的实现,性能更加优越。 Zuul的实现方式比较老式

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包