graphql-proxy-cache
graphql-proxy-cache 插件提供了缓存 GraphQL 查询响应的能力。它使用 MD5 算法基于插件配置和 GraphQL 查询生成缓存键。该插件支持基于磁盘和基于内存的缓存选项,可以缓存 GET 和 POST GraphQL 请求。
如果请求包含 变更(Mutation) 操作,插件将不会缓存数据。相反,它会在响应中添加 Apisix-Cache-Status: BYPASS 头,以表明该请求绕过了缓存机制。
示例
以下示例使用 GitHub GraphQL API 作为上游,并演示了如何在不同场景下配置 graphql-proxy-cache。
要进行后续操作,请创建一个 GitHub 个人访问令牌(Personal Access Token),并为你想要交互的资源配置适当的权限范围。
在磁盘上缓存数据
与内存缓存相比,磁盘缓存策略具有系统重启时数据持久化和更大的存储容量的优势。它适用于优先考虑持久性并且可以容忍稍大缓存访问延迟的应用程序。
以下示例演示了如何在路由上使用 graphql-proxy-cache 插件将数据缓存到磁盘上。
创建一个启用了 graphql-proxy-cache 插件的路由,使用默认配置将数据缓存到磁盘:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "graphql-proxy-cache-route",
"uri": "/graphql",
"plugins": {
"graphql-proxy-cache": {}
},
"upstream": {
"type": "roundrobin",
"pass_host": "node",
"scheme": "https",
"nodes": {
"api.github.com:443": 1
}
}
}'
发送一个带有 GraphQL 查询的请求进行验证:
curl -i "http://127.0.0.1:9080/graphql" -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${GH_ACCESS_TOKEN}" \
-d '{"query": "query {viewer{login}}"}'
你应该会看到一个 HTTP/1.1 200 OK 响应,其中包含以下头部,表明插件已成功启用:
APISIX-Cache-Key: e9c1624ee35f792548512ff9f6ff1bfa
Apisix-Cache-Status: MISS
由于在第一个响应之前没有可用的缓存,因此显示 Apisix-Cache-Status: MISS。
在缓存 TTL 窗口内再次发送相同的请求。你应该会看到一个 HTTP/1.1 200 OK 响应,其中包含以下头部,表明缓存命中:
APISIX-Cache-Key: e9c1624ee35f792548512ff9f6ff1bfa
Apisix-Cache-Status: HIT
等待缓存超过 TTL 过期后,再次发送相同的请求。你应该会看到一个 HTTP/1.1 200 OK 响应,其中包含以下头部,表明缓存已过期:
APISIX-Cache-Key: e9c1624ee35f792548512ff9f6ff1bfa
Apisix-Cache-Status: EXPIRED
在内存中缓存数据
内存缓存策略具有低延迟访问缓存数据的优势,因为从 RAM 检索数据比从磁盘存储检索数据更快。它也非常适合存储不需要长期持久化的临时数据,从而允许高效地缓存频繁变化的数据。
以下示例演示了如何在路由上使用 graphql-proxy-cache 插件将数据缓存到内存中。
创建一个启用了 graphql-proxy-cache 的路由,并将其配置为使用基于内存的缓存:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "graphql-proxy-cache-route",
"uri": "/graphql",
"plugins": {
"graphql-proxy-cache": {
"cache_strategy": "memory",
"cache_zone": "memory_cache",
"cache_ttl": 10
}
},
"upstream": {
"type": "roundrobin",
"pass_host": "node",
"scheme": "https",
"nodes": {
"api.github.com:443": 1
}
}
}'
❶ cache_strategy:设置为 memory 以使用内存配置。
❷ cache_zone:设置为内存缓存区域的名称。
❸ cache_ttl:设置内存缓存的生存时间。
发送一个带有 GraphQL 查询的请求进行验证:
curl "http://127.0.0.1:9080/graphql" -i -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${GH_ACCESS_TOKEN}" \
-d '{"query": "query {viewer{login}}"}'
你应该会看到一个 HTTP/1.1 200 OK 响应,其中包含以下头部,表明插件已成功启用:
APISIX-Cache-Key: a661316c4b1b70ae2db5347743dec6b6
Apisix-Cache-Status: MISS
由于在第一个响应之前没有可用的缓存,因此显示 Apisix-Cache-Status: MISS。
在缓存 TTL 窗口内再次发送相同的请求。你应该会看到一个 HTTP/1.1 200 OK 响应,其中包含以下头部,表明缓存命中:
APISIX-Cache-Key: a661316c4b1b70ae2db5347743dec6b6
Apisix-Cache-Status: HIT
手动清除缓存
虽然大多数时候不需要这样做,但在某些情况下,你可能希望手动清除缓存数据。
以下示例演示了如何使用 public-api 插件公开由 graphql-proxy-cache 插件创建的 /apisix/plugin/graphql-proxy-cache/{cache_strategy}/{route_id}/{key} 端点,以手动清除缓存。
创建一个匹配 URI /apisix/plugin/graphql-proxy-cache/* 的路由:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "graphql-cache-purge",
"uri": "/apisix/plugin/graphql-proxy-cache/*",
"plugins": {
"public-api": {}
}
}'
发送 PURGE 请求以清除路由 1 在磁盘上缓存的数据:
curl -i "http://127.0.0.1:9080/apisix/plugin/graphql-proxy-cache/disk/1/e9c1624ee35f792548512ff9f6ff1bfa" -X PURGE
HTTP/1.1 200 OK 响应验证了与该键对应的缓存已成功清除。
如果你再次发送相同的请求,你应该会看到一个 HTTP/1.1 404 Not Found 响应,表明在缓存清除后磁盘上没有该缓存键的缓存。