Skip to content

LocalResponseCache GatewayFilter 工厂

此过滤器允许缓存响应体和响应头,并遵循以下规则:

  • 仅限 GET 请求:它只能缓存没有请求体(bodiless)的 GET 请求。
  • 特定状态码:它仅缓存以下状态码的响应:HTTP 200 (OK)、HTTP 206 (Partial Content) 或 HTTP 301 (Moved Permanently)。
  • Cache-Control 检查:如果 Cache-Control 头不允许缓存(即请求中包含 no-store,或响应中包含 no-storeprivate),则不会缓存响应数据。
  • 304 Not Modified:如果响应已被缓存,且新请求的 Cache-Control 头中包含 no-cache 值,它将返回一个状态码为 304 (Not Modified) 的无响应体响应。

启用条件: 此过滤器用于为每个路由配置本地响应缓存,且仅在 spring.cloud.gateway.filter.local-response-cache.enabled 属性设置为 true 时可用。此外,Spring Cloud Gateway 还支持全局配置的本地响应缓存

参数说明: 它接受两个参数:

  1. timeToLive (生存时间):覆盖缓存条目的过期时间(单位:s 秒、m 分、h 小时)。
  2. size (大小):设置此路由缓存的最大大小,用于驱逐旧条目(单位:KBMBGB)。

配置示例

以下示例展示了如何添加本地响应缓存 GatewayFilter

Java 配置

java
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
            .filters(f -> f.prefixPath("/httpbin")
                // 缓存时间 30 分钟,最大 500MB
                .localResponseCache(Duration.ofMinutes(30), "500MB")
            ).uri(uri))
        .build();
}

YAML 配置 (application.yaml)

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: http://localhost:9000
        predicates:
        - Path=/resource
        filters:
        - LocalResponseCache=30m,500MB

注意:Max-Age 计算

此过滤器还会自动计算 HTTP Cache-Control 头中的 max-age 值。 仅当原始响应中存在 max-age 时,该值才会被重写为配置参数 timeToLive 中设置的秒数。 在后续的调用(命中缓存)中,此值将根据响应过期前的剩余秒数重新计算。

注意:依赖要求

要启用此功能,请在项目中添加 com.github.ben-manes.caffeine:caffeinespring-boot-starter-cache 依赖。

警告

如果你的项目创建了自定义的 CacheManager Bean,则需要使用 @Primary 标记它,或者使用 @Qualifier 进行注入,以避免冲突。

补充教学 —— 为什么要用 LocalResponseCache?

在微服务架构中,有些接口的数据变化频率很低,但访问频率很高(比如“获取省市区列表”、“获取首页配置”)。

  • 没有缓存时:每次用户刷新页面,请求都要穿透网关,到达后端的微服务,查询数据库。这浪费了带宽、CPU 和数据库连接。
  • 使用 LocalResponseCache
    • 网关层拦截:网关发现这个请求之前处理过,并且还没过期。
    • 直接返回:网关直接把内存里存好的结果返回给用户,完全不打扰后端微服务
    • 高性能:响应速度极快(毫秒级),极大减轻后端压力。
  • 与 Redis 区别:这里是 Local(本地),数据存在网关实例的内存里(基于 Caffeine)。如果你有多个网关节点,它们之间的缓存是不共享的。

Based on Spring Framework.