操作场景
本文介绍如何在 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-Status
为 Miss
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8Content-Length: 335X-Cache-Key: 6fb1b6a4440980c758b0eff31177a41dX-Cache-Status: MissDate: Tue, 26 Apr 2022 16:04:19 GMTX-Kong-Upstream-Latency: 948X-Kong-Proxy-Latency: 321Via: kong/2.4.1
缓存 TTL 之内再次请求
GET /cache/it
,会命中缓存,响应头 X-Cache-Status
为 Hit
HTTP/1.1 200 OKServer: openrestyContent-Type: application/json; charset=utf-8X-Cache-Key: 6fb1b6a4440980c758b0eff31177a41dAge: 2X-Cache-Status: HitDate: Tue, 26 Apr 2022 16:09:23 GMTVary: Accept-EncodingContent-Length: 335X-Kong-Upstream-Latency: 0X-Kong-Proxy-Latency: 0Via: kong/2.4.1
当
vary query params
配置了 name
参数:首次请求
GET /cache/it?name=john
,缓存不存在,会请求到后端,响应头 X-Cache-Status
为 Miss
。缓存 TTL 之内再次请求
GET /cache/it?name=john
,会命中缓存,响应头 X-Cache-Status
为 Hit
。缓存 TTL 之携带不同 name 参数请求
GET /cache/it?name=tom
,由于 name 参数不同,响应头 X-Cache-Status
为 Miss
。场景二:通过 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
原因请求绕过了缓存。参考