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(部分内容)和 HTTP 301(永久移动)。
  • 我们遵循 HTTP Cache-Control 规范,因此它只会缓存 Cache-Control 标头允许缓存的情况。这意味着请求中不存在 no-store,响应中不存在 no-storeprivate。此外,如果响应已被缓存并且使用 Cache-Control 标头中的 no-cache 值执行了新的请求,它将返回一个状态代码为 HTTP 304(未修改)的无正文响应。

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

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

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

其他资源

想要了解有关 Spring Cloud 的更多信息?请在 SpringOne 上与我们在线交流!想了解更多关于 Spring Cloud Gateway 的信息?请查看 我们支持 Kubernetes 的商业平台

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部