Spring Cloud Gateway 4.0 中的有趣新过滤器

工程 | Marta Medio | 2023 年 1 月 18 日 | ...

Spring Cloud Gateway 4.0 终于来了!感谢社区贡献,我们引入了新特性和有趣的过滤器。

这篇博文详细介绍了新亮点,并解释了其中一些新过滤器的工作原理以及如何使用它们来更深入地了解您的应用程序。

首先,我们来谈谈缓存!缓存是一个复杂的问题,正因如此,我们引入了两个与其相关的新过滤器,但请注意,这些过滤器可能会限制网关的内存,因此请谨慎使用。

CacheRequestBody

如果处理不当,操作请求体可能会导致问题,所以我们为您简化了操作;通过这个过滤器,我们可以在请求体发送到下游之前对其进行缓存,并通过交换属性获取该请求体。它将存储在 ServerWebExchange.getAttributes() 中,键名由 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR 定义,以便在后续过滤器中使用。

配置该过滤器,只需简单指定要转换成的请求体类类型即可。

spring:
  cloud:
    gateway:
      routes:
      - id: cache_request_body_route
        uri: http://downstream
        predicates:
        - Path=/get/**
        filters:
        - name: CacheRequestBody
          args:
            bodyClass: java.lang.String

此过滤器仅适用于 HTTP 请求(包括 HTTPS)。

LocalCacheResponseBody

有时您的网关会调用一些服务,您知道它们的响应随时间不会发生变化。为了提高性能并避免每次请求都去下游获取相同的响应,我们添加了一个新过滤器,允许对响应体和响应头进行本地缓存。

此新功能在全局级别实现,但也可在路由级别覆盖全局配置,为那些您知道需要特殊处理的路由设置特定行为。

有一些条件必须考虑在内

  • 它只缓存没有请求体的 GET 请求。
  • 它只缓存状态码为以下值的响应:HTTP 200 (OK), HTTP 206 (Partial Content) 和 HTTP 301 (Moved Permanently)。
  • 我们遵循 HTTP Cache-Control 规范,因此只有在 Cache-Control 头部允许的情况下才会进行缓存。这意味着请求中没有 no-store,响应中没有 no-storeprivate。此外,如果响应已缓存,并且新的请求在 Cache-Control 头部带有 no-cache 值,则将返回一个无响应体且状态码为 HTTP 304 (Not Modified) 的响应。

要激活此全局缓存过滤器,只需将以下属性设置为 true 即可:spring.cloud.gateway.filter.local-response-cache.enabled

我们提供了一些配置属性来管理响应缓存的工作方式,通过 spring.cloud.gateway.filter.local-response-cache.size,您可以设置缓存的最大大小以驱逐条目,它接受 KBMBGB 的大小格式;spring.cloud.gateway.filter.local-response-cache.timeToLive 属性设置缓存条目的过期时间,以 s 表示秒,m 表示分钟,h 表示小时。

spring:
  cloud:
    gateway:
      filter:
	  local-response-cache:
	    enabled: true
	    timeToLive: 20m
	    size: 6MB

如果未配置这些参数中的任何一个,但用于激活全局过滤器的属性已启用,则网关默认将缓存响应的生存时间配置为 5 分钟,且无大小限制。

如前所述,我们提供了在每个路由上实现过滤器来覆盖全局配置的可能性。但请注意,必须启用全局过滤器才能设置每个路由的配置!路由配置接受第一个参数来覆盖该路由驱逐条目的最大缓存大小(大小格式为 KBMBGB),以及第二个参数来覆盖缓存条目的过期时间(以 s 表示秒,m 表示分钟,h 表示小时)

spring:
 cloud:
   gateway:
     routes:
     - id: local_response_cache_get_route
       uri: http://downstream
       predicates:
       - Path=/get/data
       filters:
       - LocalResponseCache=10s,10MB

此功能背后的一个有趣之处在于,它还实现了 HTTP Cache-Control 头部中 max-age 值的计算。因此,如果原始响应中存在 max-age,则该值将使用 timeToLive 配置参数中设置的秒数进行重写,在后续调用中,此值将根据响应过期前剩余的秒数重新计算。

AddRequestHeadersIfNotPresent

过滤器的名称几乎说明了一切,它与 AddRequestHeader 的工作方式非常相似,但与 AddRequestHeader 不同的是,它只在请求中不存在该头部时才添加。否则,将发送客户端请求中的原始值。

它接受由冒号分隔的名称-值对集合

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Color:blue,X-Header-Color:red

它还支持用于匹配路径或主机的 URI 变量

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors/{segment}
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Red:blue-{segment}

您还可以设置一个多值头部!只需多次添加相同的头部名称/值即可。

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors/
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Color:blue,X-Request-Color:green

RemoveJsonAttributesResponseBody

JSON 是最常用的数据表示格式之一,正因如此,我们希望添加更多针对此格式响应的特定功能。此过滤器提供了一种方便的方法,通过删除 JSON 体内容中的属性来应用转换。

它接受要查找的属性名称集合,列表中的最后一个参数可以是可选的布尔值,用于仅在根级别删除属性(这是默认值 false,如果参数配置末尾没有提供)或递归删除属性(true)。

spring:
 cloud:
   gateway:
     routes:
     - id: remove_json_attributes_route
       uri: https://downstream
 	 predicates:
       - Path=/json/
       filters:
       - RemoveJsonAttributesResponseBody=created_date,color

上述配置将从 JSON 内容体中移除属性,但仅限于根级别。

spring:
 cloud:
   gateway:
     routes:
     - id: remove_json_attributes_route
       uri: https://downstream
 	 predicates:
       - Path=/json/
       filters:
       - RemoveJsonAttributesResponseBody=created_date,color,true

在末尾添加 true 属性将移除 JSON 结构中任何级别的属性。

这些过滤器增加了强大的新功能。我们很想听听它们如何支持您的用例以及我们如何提高您的工作效率。您可以在其参考文档中找到有关此新过滤器和其他功能的更多信息。

感谢所有通过报告和拉取请求做出贡献的人们!

额外资源

想了解更多关于 Spring Cloud 的信息吗?欢迎在线加入我们的 SpringOne 大会!想了解更多关于 Spring Cloud Gateway 的功能吗?请查看我们支持 Kubernetes 的商业平台

订阅 Spring 邮件列表

通过 Spring 邮件列表保持联系

订阅

抢占先机

VMware 提供培训和认证,助力您加速前行。

了解更多

获取支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一个简单的订阅。

了解更多

即将举办的活动

查看 Spring 社区中所有即将举办的活动。

查看全部