Kong实现性能的方式之一是通过缓存。代理缓存插件通过根据可配置的响应代码、内容类型和请求方法缓存响应来加快性能。当启用缓存时,上游服务不会因为重复的请求而陷入困境,因为Kong网关会代表它们使用缓存结果进行响应。可以在特定的Kong网关对象上启用缓存,也可以全局为所有请求启用缓存。
缓存生存时间(TTL)
TTL(Time To Live)管理缓存内容的刷新率,这对确保客户端不会受到过时内容的影响至关重要。30秒的TTL意味着超过30秒的内容将被视为过期,并将在后续请求中刷新。根据上游服务提供的内容类型,应该根据不同设置TTL 配置。
- 稀少更新的静态数据可以设置较长的TTL。
- 动态数据应该使用较短的TTL 以避免提供过时数据。
Kong网关遵循RFC-7234第5.2节关于缓存控制操作的规范。有关TTL 配置的详细信息,请参阅规范和代理缓存插件参数参考。
先决条件
这一章节是"开始使用Kong"系列的一部分。为了获得最佳体验,建议您从头开始按照该系列进行学习。
从介绍"获取Kong"开始,其中包括先决条件列表和在本地运行Kong网关的说明。
指南的第二步"服务和路由"包括安装一个在整个系列中都会用到的模拟服务的说明。
如果您尚未完成这些步骤,请在继续之前完成它们。
全局代理缓存
全局安装插件意味着每个代理请求到Kong网关都有可能被缓存。
1. 启用代理缓存
代理缓存插件默认安装在Kong网关上,并可以通过向Admin API的plugins对象发送POST请求来启用:
Lua
curl -i -X POST http://localhost:8001/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json; charset=utf-8" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
如果配置成功,您将收到201响应代码。
这个Admin API请求为所有产生响应代码为200和响应Content-Type头等于application/json; charset=utf-8的GET请求配置了一个代理缓存插件。cache_ttl 指示插件在30秒后刷新值。
最终选项config.strategy=memory指定了用于缓存响应的后端数据存储。有关strategy的更多信息可以在代理缓存插件的参数参考中找到。
2. 验证
您可以通过发送GET请求并检查返回的头信息来验证代理缓存插件是否正在运行。在本指南的第二步中,服务和路由中,您设置了一个/mock路由和服务,可以帮助您看到代理缓存的实际效果。
首先,对/mock路由进行初始请求。代理缓存插件返回以X-Cache为前缀的状态信息头部,因此请使用grep来过滤这些信息:
Lua
curl -i -s -XGET http://localhost:8000/mock/anything | grep X-Cache
在初始请求中,不应该有缓存的响应,头部会通过X-Cache-Status: Miss来指示这一点。
Lua
X-Cache-Key: c9e1d4c8e5fd8209a5969eb3b0e85bc6
X-Cache-Status: Miss
在初始请求后的30秒内,重复发送相同的请求命令,头部会显示缓存命中(cache Hit)的信息。
Lua
X-Cache-Key: c9e1d4c8e5fd8209a5969eb3b0e85bc6
X-Cache-Status: Hit
X-Cache-Status头部可以返回以下缓存结果:
STATE(状态) | DESCRIPTION(描述) |
---|---|
Miss | 请求可以在缓存中得到满足,但是缓存中未找到该资源的条目,请求被代理到上游。 |
Hit | 请求已经在缓存中得到满足并从缓存中提供。 |
Refresh | 该资源在缓存中被找到,但由于Cache-Control行为或达到设置的硬编码cache_ttl阈值而无法满足请求。 |
Bypass | 基于插件配置,请求无法从缓存中满足。 |
服务级别代理缓存
代理缓存插件可以针对特定服务进行启用。请求与上面相同,但请求发送到服务URL:
Lua
curl -X POST http://localhost:8001/services/example_service/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json; charset=utf-8" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
路由级别代理缓存
代理缓存插件可以针对特定路由进行启用。请求与上面相同,但请求发送到路由URL:
Lua
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json; charset=utf-8" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
消费者级别代理缓存
在Kong网关中,消费者是定义服务用户的抽象概念。消费者级别代理缓存可用于按消费者缓存响应。
1. 创建消费者
消费者是通过Admin API中的consumer对象创建的。
Lua
curl -X POST http://localhost:8001/consumers/ \
--data username=sasha
2. 为消费者启用缓存
Lua
curl -X POST http://localhost:8001/consumers/sasha/plugins \
--data "name=proxy-cache" \
--data "config.request_method=GET" \
--data "config.response_code=200" \
--data "config.content_type=application/json; charset=utf-8" \
--data "config.cache_ttl=30" \
--data "config.strategy=memory"
管理缓存实体
代理缓存插件支持管理端点来管理缓存实体。管理员可以查看和删除缓存实体,或者通过向Admin API发送请求来清除整个缓存。
要检索缓存实体,请向Admin API的/proxy-cache端点提交一个请求,其中包括已知缓存值的X-Cache-Key值。此请求必须在TTL过期之前提交,否则缓存实体已被清除。
例如,使用上面的响应头信息,将值为c9e1d4c8e5fd8209a5969eb3b0e85bc6的X-Cache-Key传递给Admin API:
Lua
curl -i http://localhost:8001/proxy-cache/c9e1d4c8e5fd8209a5969eb3b0e85bc6
带有200 OK的响应将包含缓存实体的全部详细信息。
请参阅Proxy Cache插件文档,获取Proxy Cache特定Admin API端点的完整列表。