Kong 代理缓存

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端点的完整列表。

相关推荐
wclass-zhengge1 天前
SpringCloud篇(服务网关 - GateWay)
spring boot·spring cloud·gateway
H愚公移山H1 天前
Spring Cloud Alibaba [Gateway]网关。
java·gateway·springcloud
醇氧1 天前
【spring 】Spring Cloud Gateway 的Filter学习
学习·spring·gateway
蚰蜒螟1 天前
Spring gateway 路由 配置在数据库
数据库·spring·gateway
因我你好久不见2 天前
解决绿盟漏洞扫描 gateway、nacos、springboot tomcat检测到目标主机可能存在缓慢的HTTP拒绝服务攻击问题
spring boot·http·gateway
moxiaoran57535 天前
搭建Spring gateway网关微服务
spring·微服务·gateway
飞天大拖把5 天前
Zuul和GateWay
gateway
.生产的驴7 天前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
菜菜-plus8 天前
分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
java·分布式·微服务·nacos·gateway·springcloud·openfeign
七月在野,八月在宇,九月在户8 天前
前端--> nginx-->gateway产生的跨域问题分析
前端·nginx·gateway