LocalResponseCache GatewayFilter 工厂
此过滤器允许缓存响应体和响应头,并遵循以下规则:
- 仅限 GET 请求:它只能缓存没有请求体(bodiless)的 GET 请求。
- 特定状态码:它仅缓存以下状态码的响应:HTTP 200 (OK)、HTTP 206 (Partial Content) 或 HTTP 301 (Moved Permanently)。
- Cache-Control 检查:如果
Cache-Control头不允许缓存(即请求中包含no-store,或响应中包含no-store或private),则不会缓存响应数据。 - 304 Not Modified:如果响应已被缓存,且新请求的
Cache-Control头中包含no-cache值,它将返回一个状态码为 304 (Not Modified) 的无响应体响应。
启用条件: 此过滤器用于为每个路由配置本地响应缓存,且仅在 spring.cloud.gateway.filter.local-response-cache.enabled 属性设置为 true 时可用。此外,Spring Cloud Gateway 还支持全局配置的本地响应缓存。
参数说明: 它接受两个参数:
- timeToLive (生存时间):覆盖缓存条目的过期时间(单位:
s秒、m分、h小时)。 - size (大小):设置此路由缓存的最大大小,用于驱逐旧条目(单位:
KB、MB或GB)。
配置示例
以下示例展示了如何添加本地响应缓存 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:caffeine 和 spring-boot-starter-cache 依赖。
警告
如果你的项目创建了自定义的 CacheManager Bean,则需要使用 @Primary 标记它,或者使用 @Qualifier 进行注入,以避免冲突。
补充教学 —— 为什么要用 LocalResponseCache?
在微服务架构中,有些接口的数据变化频率很低,但访问频率很高(比如“获取省市区列表”、“获取首页配置”)。
- 没有缓存时:每次用户刷新页面,请求都要穿透网关,到达后端的微服务,查询数据库。这浪费了带宽、CPU 和数据库连接。
- 使用 LocalResponseCache:
- 网关层拦截:网关发现这个请求之前处理过,并且还没过期。
- 直接返回:网关直接把内存里存好的结果返回给用户,完全不打扰后端微服务。
- 高性能:响应速度极快(毫秒级),极大减轻后端压力。
- 与 Redis 区别:这里是
Local(本地),数据存在网关实例的内存里(基于 Caffeine)。如果你有多个网关节点,它们之间的缓存是不共享的。