使用缓存加速访问

最近更新时间:2024-01-19 11:56:21

我的收藏

操作场景

本文介绍如何在 Kong 云原生 API 网关上通过缓存(Proxy Cache)插件实现下述常见缓存场景:
针对指定 API 开启缓存插件。
通过 Admin API 查看指定缓存。
通过 Admin API 删除指定缓存。

前置条件

已购买 Kong 网关实例,详情请参见 操作文档
配置了后端(Service)以及路由(Route)。

操作步骤

场景一:针对指定 API 开启缓存插件

1. 登录 TSE 控制台,进入需要配置限流插件的 Kong 网关实例详情页,在 Konga 控制台页面查看管理控制台登录方式。



2. 登录 Konga 管理控制台,进入需要限流的 Route 详情页,单击 Add Plugin 按钮创建插件,在 Traffic Control 分组下选择 Proxy Cache 插件。


3. 在插件配置中填写以下配置,点击 enter键,并保存。
response code:200 // 允许缓存的后端响应码列表。建议输入正常响应码(例如 200),避免异常响应内容被缓存。
request method:GET // 允许缓存的请求方法。
content type:application/json; charset=utf-8 // 允许缓存的后端响应 Content-Type,注意该值必须和响应头完全匹配,例如 "application/json" 和 "application/json; charset=utf-8" 是不匹配的。
cache ttl:60 // 缓存时长,单位秒。


4. 如果需要根据参数维度缓存,则需要额外配置。
vary query params: name, department // 用于缓存 key 的 query 参数名称列表,默认为空。
vary headers: x-cache-header // 用于缓存 key 的 header 参数名称列表,默认为空。


5. 发起 API 请求,验证缓存生效。
首次请求 API URL GET /cache/it,缓存不存在,会请求到后端,响应头 X-Cache-StatusMiss
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 335
X-Cache-Key: 6fb1b6a4440980c758b0eff31177a41d
X-Cache-Status: Miss
Date: Tue, 26 Apr 2022 16:04:19 GMT
X-Kong-Upstream-Latency: 948
X-Kong-Proxy-Latency: 321
Via: kong/2.4.1
缓存 TTL 之内再次请求 GET /cache/it,会命中缓存,响应头 X-Cache-StatusHit
HTTP/1.1 200 OK
Server: openresty
Content-Type: application/json; charset=utf-8
X-Cache-Key: 6fb1b6a4440980c758b0eff31177a41d
Age: 2
X-Cache-Status: Hit
Date: Tue, 26 Apr 2022 16:09:23 GMT
Vary: Accept-Encoding
Content-Length: 335
X-Kong-Upstream-Latency: 0
X-Kong-Proxy-Latency: 0
Via: kong/2.4.1
vary query params 配置了 name 参数:
首次请求 GET /cache/it?name=john,缓存不存在,会请求到后端,响应头 X-Cache-StatusMiss
缓存 TTL 之内再次请求 GET /cache/it?name=john,会命中缓存,响应头 X-Cache-StatusHit
缓存 TTL 之携带不同 name 参数请求 GET /cache/it?name=tom,由于 name 参数不同,响应头 X-Cache-StatusMiss

场景二:通过 Admin API 查看指定缓存

1. 通过 Proxy 代理方式开放 admin api(建议开启安全认证)。
2. 调用 Proxy Cache API GET /proxy-cache/:cache_key 查询特定 Cache Key 的缓存内容:
Cache Key 从 API 请求的响应头 X-Cache-Key 获取。
当 Cache 不存在时,返回 404。
当 Cache 存在时,返回 200,响应 Body 如下:
{
"ttl": 60,
"req_body": "",
"headers": {
"Date": "Wed, 27 Apr 2022 03:09:39 GMT",
"X-Cache-Status": "Miss",
"ETag": "W/\\"14f-3sRRcm7jenKggj3qhgagNHIwiqw\\"",
"Vary": "Accept-Encoding",
"connection": "keep-alive",
"set-cookie": "sails.sid=s%3AT_YQH4rJgm2TYpJ5o6Ql1nH-vlA6pR19.JR3bgC6WfzWO1OqDPwzaNn%2FXX6PcGdg2vTaT6d1BbfQ; Path=/; HttpOnly",
"content-length": "335",
"content-type": "application/json; charset=utf-8",
"X-Cache-Key": "6fb1b6a4440980c758b0eff31177a41d"
},
"body": "<cached response body>",
"status": 200,
"timestamp": 1651028979,
"version": 1,
"body_len": 335
}

注意事项

缓存内容包含响应 Body 和响应 Headers (不缓存 Hop-By-Hop headers)。
如需在客户端中通过 Cache-Control 请求头对缓存行为进行动态控制,则需要在插件中启用 cache-control 配置项。
X-Cache-Status 响应头说明:
Miss:请求匹配缓存策略,但未命中缓存。
Hit:请求命中缓存。
Bypass:请求和缓存插件配置规则不匹配。
Refresh:缓存未过期,但由于请求头中 Cache-Control 原因请求绕过了缓存。

参考

更多相关说明请参见 Kong Proxy Cache 插件文档