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


Spring Cloud Gateway 4.0终于来了!感谢我们的社区贡献,我们推出了新功能和有趣的过滤器。
这篇博文详细介绍了新的值得注意的内容,并解释了其中包含的一些新过滤器、它们的工作原理以及如何使用它来提供对应用程序的更多见解。
首先,让我们谈谈缓存!缓存是一个复杂的问题,这就是为什么我们引入了两个与之相关的新过滤器,但要考虑到这些过滤器会使网关内存受限,因此请谨慎使用它们。

CacheRequestBody
此过滤器提供了在请求主体缓存到下游之前缓存请求主体并从交换属性获取该主体的可能性。

从交换属性获取该主体:ServerWebExchange.getAttributes(),key是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头允许的情况下进行缓存。这意味着它没有以下任何一个值:请求中没有存储,响应中没有存储或私有。此外,如果响应已经被缓存了,并且一个新的请求在Cache-Control头中使用了no-cache值,它将返回一个状态代码为HTTP 304(未修改)的无正文响应。

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

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

我们提供了几个配置属性来管理响应上的缓存应该如何工作:

  • spring.cloud.gateway.filter.local-response-cache.size,你可以设置缓存驱逐条目的最大尺寸,它采用KB、MB和GB的尺寸格式;
  • spring.cloud.gateway.filter.local-response-cache.timeToLive属性设置缓存条目过期的时间,用s表示秒,m表示分钟,h表示小时。

如果没有配置这些参数,但启用了激活全局过滤器的属性,Gateway默认为缓存响应配置了5分钟的时间,没有任何大小限制。

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

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内容体中删除属性,但只在根级别。

更多点击标题