属性 | 描述 |
---|---|
限流策略 | 终止请求限制 |
插件作用域 | 服务、路由、消费者、全局 |
适用协议 | http、https |
参数 | 描述 |
---|---|
name | 插件名称、此处为proxy-cache |
service_id | 绑定的服务Id |
route_id | 绑定的路由Id |
enabled | 是否启用该插件,默认是true |
consumer_id | 绑定的消费者Id |
api_id | 绑定的API Id,已经废弃 |
response_code | 上游服务可以作为缓存的状态码,默认值为200, 301, 404 |
request_method | 下游服务可以作为缓存的方法,默认为GET, HEAD |
content_type | 可以作为缓存的 content type |
vary_headers | 用于生成缓存Key的头部信息,如果不指定,所有头部信息都不作为数据源 |
vary_query_params | 用于生成缓存Key的查询参数,如果不指定,所有查询参数都作为数据源 |
cache_ttl | 缓存的TTL时间,默认是300s |
cache_control | 是否启用Cache-Control行为,默认是false |
storage_ttl | 数据在存储引擎中的TTL时间 |
strategy | 缓存策略,可以取 memory 或 redis |
memory.dictionary_name | 当选用 memory 策略时,用于保存缓存实体的 shared dictionary 的名称,这个 shared dictionary |
redis.host | redis服务器地址 |
redis.port | redis服务器端口 |
redis.timeout | 连接redis服务器超时时间 |
redis.password | redis服务器密码 |
redis.database | redis数据库 |
redis.sentinel_master | redis哨兵模式master节点地址 |
redis.sentinel_role | redis哨兵模式角色 |
redis.sentinel_addresses | redis哨兵模式哨兵地址 |
在服务上添加插件
curl -X POST http://kong:8001/services/{service}/plugins --data "name=proxy-cache" --data "strategy=memory"
在路由上添加插件
curl -X POST http://kong:8001/routes/{route}/plugins --data "name=proxy-cache" --data "strategy=memory"
在消费者上添加插件
curl -X POST http://kong:8001/apis/{api}/plugins --data "name=proxy-cache" --data "strategy=memory"
模式 | 描述 |
---|---|
memory | 内存模式,是一个lua_shared_dict,默认的kong_cache也被Kong的其他插件用于缓存其他数据,使用这种方式比较简单,但不推荐在大规模场景中使用,因为大量使用会对Kong数据缓存操作造成压力 |
redis | 支持redis和redis哨兵模式 |
Kong基于请求方法、完整的客户端请求(路径和请求参数)和绑定在请求上的API或消费者UUID来生成缓存 Key,所以各个API或消费者之间的缓存都是不同的,目前缓存Key的格式是硬编码的,无法调整,缓存的组成方式如下:
key = md5(UUID | method | request)
其中 method 是通过 ngx.req.get_method() 方法获得的,request 是根据 Nginx $request 变量获得的,Kong会在响应的 X-Cache-Key 头中返回缓存Key值,如上所述,可以预先计算缓存Key
- 缓存控制
当启用 cache_control 时,Kong将遵守 Cache-Control 头的使用规范,有一些例外情况:
不支持缓存重新验证
类似地,no-cache 排除缓存存在
不支持根据 Vary 计算二级缓存 - 缓存状态
Kong通过 X-Cache-Status 头表示缓存行为的状态:
状态 | 描述 |
---|---|
Miss | 请求可以缓存,但是缓存中没有数据,数据从代理的服务中获取 |
Hit | 缓存命中,数据从缓存中获取 |
Refresh | 缓存命中,但因为缓存控制行为或者达到了cache_ttl设置的阈值 |
Bypass | 不能使用缓存 |
Kong可以在存储引擎中存储数据,存储时间超过 cache_ttl 或 Cache-Control 阈值所限定的时间,这使得Kong在资源过期后,还能维持一份资源的缓存副本,这样客户端在必要时可以使用 max-age 或 max-stale 头请求过期的数据
GET /proxy-cache/:plugin_id/caches/:cache_id
GET /proxy-cache/:cache_id
- 删除缓存实体
DELETE /proxy-cache/:plugin_id/caches/:cache_id
DELETE /proxy-cache/:cache_id
- 清除所有缓存
DELETE /proxy-cache/