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)。

要激活此全局缓存过滤器,只需将以下属性设置为 truespring.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 结构任何级别的 JSON 内容主体中删除属性。

这些过滤器增加了强大的新功能。我们很乐意听取您对它们如何支持您的用例以及我们如何提高您的生产力的意见。您可以在其参考文档中找到有关此新过滤器和其他功能的更多信息。

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

其他资源

想了解更多关于 Spring Cloud 的信息吗?请虚拟加入我们参加 SpringOne!想了解更多关于 Spring Cloud Gateway 的产品吗?请查看 我们支持 Kubernetes 的商业平台

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看所有