GraphQL 简介回顾#
GraphQL 是 Facebook 开发的一种 API 查询语言,相比传统 REST API,能更灵活地获取数据。
GraphQL 的特点#
- 单一端点:REST API 需要多个端点,GraphQL 只需一个端点(如
/graphql
),可发送不同查询。 - 只获取所需数据:客户端可指定所需字段,避免无用数据传输。
- 类型系统:API 的 schema 以类型定义,数据结构清晰。
例如,向 https://countries.trevorblades.com/
这个 GraphQL API 发送如下查询,可获取日本的国家信息:
1
2
3
4
5
6
7
| {
country(code: "JP") {
name
capital
currency
}
}
|
用 curl
执行该查询:
1
2
3
| curl -X POST https://countries.trevorblades.com/ \
-H "Content-Type: application/json" \
-d '{"query": "{ country(code: \"JP\") { name capital currency } }"}'
|
响应:
1
2
3
4
5
6
7
8
9
| {
"data": {
"country": {
"name": "Japan",
"capital": "Tokyo",
"currency": "JPY"
}
}
}
|
GraphQL 的强大之处在于可灵活调整查询内容。例如去掉 capital
字段:
1
2
3
| curl -X POST https://countries.trevorblades.com/ \
-H "Content-Type: application/json" \
-d '{"query": "{ country(code: \"JP\") { name currency } }"}'
|
响应中就没有 capital
字段:
1
2
3
4
5
6
7
8
| {
"data": {
"country": {
"name": "Japan",
"currency": "JPY"
}
}
}
|
你可以随时动态调整所需数据类型。
GraphQL 的劣势#
- 复杂性:客户端需自行设计查询,学习曲线高于 REST。
- 缓存难度大:REST 可基于 URL 缓存,GraphQL 主要用 POST,缓存策略更复杂。
- 负载问题:客户端可发复杂查询,服务器压力可能增大。
Kong 概述#
Kong 是开源 API 网关,负责 API 管理、认证、路由、负载均衡等。
Kong 的作用#
- API 管理:API 发布、认证、限流、监控
- 插件扩展:支持认证、缓存、限流、转换等插件
- 负载均衡与可扩展性:可将请求分发到多个后端服务
Kong 不仅能管理 RESTful API,也能管理 GraphQL API。GraphQL 灵活高效,Kong 是实际运维 GraphQL API 的利器。
Kong 可用的 GraphQL 相关插件#
- DeGraphQL:将 GraphQL API 转换为 RESTful API 使用的插件
- GraphQL Caching:缓存 GraphQL 响应,降低重复请求负载
- GraphQL Rate Limiting:限制 GraphQL API 请求数的插件
DeGraphQL 插件介绍#
DeGraphQL 插件让你在 Kong 中像操作 RESTful API 一样操作 GraphQL。

主要功能#
- 将对 GraphQL API 的请求转换为 REST 格式
- 客户端无需编写 GraphQL 查询
- 可用现有 REST API 客户端和工具直接访问
这样即使不懂 GraphQL 的开发者也能轻松获取数据。
Demo:用 Kong 像 REST 一样访问 GraphQL#
创建 Service 和 Route#
首先创建指向 GraphQL 端点的 Service,并定义对应 Route。
1
2
3
4
5
6
7
8
9
| # 创建 Service
curl -i -X POST http://localhost:8001/services \
--data "name=countries-graphql" \
--data "url=https://countries.trevorblades.com/"
# 创建 Route
curl -i -X POST http://localhost:8001/routes \
--data "service.name=countries-graphql" \
--data "paths[]=/dql"
|
启用 DeGraphQL 插件#
然后为 Service 启用 DeGraphQL 插件。注意该插件只能在 Service 层创建。
1
2
| curl -X POST http://localhost:8001/services/countries-graphql/plugins \
--data name="degraphql"
|
DeGraphQL 路由配置#
最后创建 DeGraphQL 路由,设置 GraphQL 查询内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| curl -X POST http://localhost:8001/services/countries-graphql/degraphql/routes \
--data uri='/:country' \
--data query='query ($country:ID!) {
country(code: $country) {
name
native
capital
emoji
currency
languages {
code
name
}
}
}'
|
通过 Kong 像 REST 一样访问#
配置完成后,可像 REST API 一样通过 Kong 访问:
1
| curl -X GET http://localhost:8000/dql/JP
|
会返回如下响应:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| {
"name": "Japan",
"native": "日本",
"capital": "Tokyo",
"emoji": "🇯🇵",
"currency": "JPY",
"languages": [
{
"code": "ja",
"name": "Japanese"
}
]
}
}
|
本 Demo 展示了如何用 Kong 的 DeGraphQL 插件将 GraphQL API 当作 REST API 使用。
- 不懂 GraphQL 的开发者也能像用 REST 一样访问
- 现有 REST 客户端可直接复用
- 利用 Kong 作为 API 网关实现灵活路由
GraphQL Proxy Caching Advanced 插件介绍#
GraphQL Proxy Caching Advanced 是 Kong 的 GraphQL API 高级缓存插件。它缓存 GraphQL 响应,避免重复请求重复计算,提升性能。
主要功能#
- 请求缓存:对相同查询应用缓存,减轻后端压力
- 缓存过期设置:可设置 TTL(存活时间),合理保留缓存
- 缓存绕过:可将特定请求排除在缓存之外
GraphQL Proxy Caching Advanced Demo#
启用插件#
首先为目标 Service 启用 GraphQL Proxy Caching Advanced。
1
2
3
4
| curl -X POST http://localhost:8001/services/countries-graphql/plugins \
--data name="graphql-proxy-cache-advanced" \
--data config.strategy="memory" \
--data config.cache_ttl=300
|
此配置将缓存策略设为内存,TTL 为 300 秒(5 分钟)。也可用 Redis。
验证缓存效果#
第一次请求(无缓存):
1
2
3
4
5
6
7
8
9
10
| curl -vvv -X GET http://localhost:8000/dql/JP
...
< X-Cache-Key: a3dad8528d327acbab14c19dc9057727fc1bcf0a236d2c95110a174919507dbb
< X-Cache-Status: Miss
< X-Kong-Upstream-Latency: 174
< X-Kong-Proxy-Latency: 12
...
* Connection #0 to host localhost left intact
{"data":{"country":{"name":"Japan","native":"日本","capital":"Tokyo","emoji":"🇯🇵","currency":"JPY","languages":[{"code":"ja","name":"Japanese"}]}}}%
|
首次请求会访问后端 GraphQL API 并返回响应。此时还没有缓存,X-Cache-Status: Miss
,延迟 174ms。
再次请求同样内容:
1
2
3
4
5
6
7
8
9
| curl -vvv -X GET http://localhost:8000/dql/JP
...
< X-Cache-Key: a3dad8528d327acbab14c19dc9057727fc1bcf0a236d2c95110a174919507dbb
< X-Cache-Status: Hit
< X-Kong-Upstream-Latency: 0
< X-Kong-Proxy-Latency: 1
...
* Connection #0 to host localhost left intact
{"data":{"country":{"name":"Japan","native":"日本","capital":"Tokyo","emoji":"🇯🇵","currency":"JPY","languages":[{"code":"ja","name":"Japanese"}]}}}%
|
X-Cache-Status: Hit
说明缓存生效,响应直接由 Kong 返回。< X-Kong-Upstream-Latency: 0
表示未访问上游 API,延迟为 0ms。
缓存操作#
可用插件提供的 API Endpoint 检查和删除缓存。详见 https://docs.konghq.com/hub/kong-inc/graphql-proxy-cache-advanced/api/#managing-cache-entities
。
利用 GraphQL Proxy Caching Advanced 可提升 GraphQL API 性能:
- 请求缓存加速响应,减轻后端压力
- 合理设置缓存策略和 TTL,平衡数据新鲜度与性能
- 灵活绕过和清理缓存,便于管理
GraphQL Rate Limiting Advanced 插件介绍#
GraphQL Rate Limiting Advanced 是 Kong 的 GraphQL API 高级限流插件。可防止过量请求,减轻 API 服务压力。
主要功能#
- 请求数限制:限制特定时间段内的请求数,防止服务过载
- 按用户限流:可为每个用户单独设置限流
- 动态限流:可灵活调整请求限制
GraphQL Rate Limiting Advanced Demo#
启用插件#
首先为目标 Service 启用 GraphQL Rate Limiting Advanced。
1
2
3
4
5
| curl -i -X POST http://localhost:8001/services/countries-graphql/plugins \
--data name=graphql-rate-limiting-advanced \
--data config.limit=3,100 \
--data config.window_size=60,3600 \
--data config.sync_rate=1
|
本例配置为每分钟最多 3 次、每小时最多 100 次请求。
通过 Kong,可以更高效地管理 GraphQL API,提升安全性和性能。用 DeGraphQL 插件可像 REST 一样操作 GraphQL,结合限流和缓存插件可管理负载、提升可用性并减少运维压力。