- https://apisix.apache.org/blog/2022/03/02/apisix-integration-graphql/
- https://juejin.cn/post/7072557615833677837?is_preload=1&module_name=iOS_tt_url&share_token=5F541E05-B8E8-43A4-B76D-660A0461924C&tt_from=copy_link&upstream_biz=iOS_url&utm_campaign=client_share&utm_medium=toutiao_ios&utm_source=copy_link
- https://learning.postman.com/docs/sending-requests/graphql/graphql-overview
GraphQL 是什么?
GraphQL 是一种用于 API 的查询语言和运行时,由 Facebook 于 2012 年内部开发并于 2015 年公开。它的焦点作用是为客户端提供一种精确、机动且高效的方式来从服务端获取所需的数据。
一、GraphQL 是什么?
你可以将 GraphQL 明白为客户端与服务器之间的一种“对话协议”。客户端通过它向服务器发送一份结构化的“数据需求清单”(即查询语句),服务器则严酷按照这份清单的格式和要求,返回恰恰满意需求的数据,不多不少。
这与您更认识的 REST API 形成光显对比。在 REST 中,客户端通过访问差异的 URL 端点(如 /users 或 /posts)来获取数据,而每个端点返回的数据结构是固定的。GraphQL 则通常只有一个端点(如 /graphql),客户端通过改变查询语句的内容来决定具体要什么。
二、GraphQL 的焦点作用与上风
其作用紧张体现在办理传统 API(如 REST)在复杂应用场景下面临的几个关键痛点:
- 精准获取,克制“太过获取”与“获取不敷”
- 题目:在 REST 中,哀求一个用户信息端点 /users/123 大概会返回该用户的全部字段(如姓名、邮箱、地点、好友列表等),纵然客户端只须要姓名。反之,如果须要展示一个博客文章及其作者信息,大概须要先调用 /posts/456,再根据返回的作者ID去调用 /users/789,产生多次往返哀求(获取不敷)。
- GraphQL 办理方案:客户端在查询中明白指定所需的字段。只须要文章标题和作者姓名?查询就只写这两个字段。服务器一次性返回这些精确的数据,克制了不须要的数据传输,也镌汰了哀求次数。
- 单一端点,强盛的范例体系
- 题目:REST API 的端点随着业务增长而膨胀(/users, /posts, /comments, /users/{id}/posts 等),难以维护和让前端开发者全面相识。
- GraphQL 办理方案:只有一个端点。全部可用的数据和操纵(查询、变动)都通过一个严酷的模式 来界说。这个模式像一份强范例的“条约”或“阐明书”,明白列出了全部可查询的对象、字段、参数及其数据范例。前端开发者可以通过工具(如 GraphiQL)直观地欣赏和测试全部本领。
- 机动顺应快速迭代的前端需求
- 题目:移动端、Web 端、桌面端大概须要同一数据的差异视图。为每个视图创建或修改 REST 端点会拖慢前后端开发服从。
- GraphQL 办理方案:前端把握数据需求的自动权。当 UI 组件须要新字段时,前端开发者只需在查询中添加该字段,无需后端专门为此修改 API 或创建新版本。这极大地提升了产物迭代速率。
三、一个简单类比
想象一下去餐厅点餐:
- REST 方式:就像点固定套餐。点“A套餐”,你会得到开胃菜、主菜、甜点和饮料(大概包罗你不喜好的)。
- GraphQL 方式:就像单点。你拿到一张完备的菜单(Schema),然后精确地写下:“我要一份牛排(查询),要五分熟(参数),而且只搭配薯条,不要沙拉(选择字段)”。厨房(服务器)会严酷按照你的单子预备。
四、焦点概念与工作原理
- 查询:用于获取数据的只读操纵。
- # 客户端发送的查询
- query {
- user(id: "123") {
- name
- email
- posts(limit: 2) { # 嵌套查询
- title
- }
- }
- }
复制代码 - 变动:用于修改数据(增、删、改)的操纵,语法雷同查询。
- mutation {
- createPost(title: "New Post", content: "Hello") {
- id # 返回新创建帖子的ID
- }
- }
复制代码 - 模式:GraphQL API 的“蓝图”,利用 模式界说语言 编写。它是客户端和服务器之间的左券。
- type Query {
- user(id: ID!): User
- }
- type User {
- id: ID!
- name: String!
- email: String
- posts: [Post!]
- }
- type Post {
- id: ID!
- title: String!
- }
复制代码 - 分析器:服务器端为模式中的每个字段界说的函数,用于告诉 GraphQL 怎样获取或盘算该字段对应的数据。
五、紧张应用场景
- 复杂应用与微服务后端:前端须要聚合来自多个微服务的数据时,GraphQL 可以作为 BFF,提供一个同一的、机动的接口。
- 移动端优先的应用:在弱网环境下,镌汰数据流量至关紧张,GraphQL 的精准查询上风显着。
- 公有 API:答应第三方开发者根据本身的需求定制数据相应,提升 API 的友爱度和实用性。
- 与您之前讨论的 APISIX 联合:API 网关(如 APISIX)可以利用 GraphQL 的查询信息(如操纵范例、字段名)来实现更智能的路由、缓存、限流和安全计谋。比方,可以为“查询”和“变动”设置差异的速率限定,大概只缓存特定的查询操纵。
总结:GraphQL 的焦点代价在于将数据需求的掌控权交给了客户端,通过声明式的查询、强范例的左券和单一的端点,办理了 API 开发中数据获取服从低下、接口僵化、前后端耦合过紧等题目,是当代复杂应用,特殊是数据驱动型应用的高效数据层办理方案。您在 APISIX 中探究的干系插件和路由功能,正是为了在网关层面更好地管理和服务这些 GraphQL API 哀求。
apisix中的graphQL
根据搜刮结果,APISIX 确实支持 GraphQL,但不是通过单一的 graphql.lua 插件来实现。在 APISIX 3.10 中,GraphQL 功能紧张通过以下几种方式提供:
1. 焦点路由的 GraphQL 属性匹配(内置功能)
这是 APISIX 对 GraphQL 的原生支持,集成在焦点路由匹配逻辑中,而不是独立的插件。
支持的路由匹配属性:
- graphql_operation:匹配 GraphQL 操纵范例(query、mutation、subscription)
- graphql_name:匹配 GraphQL 操纵名称
- graphql_root_fields:匹配 GraphQL 根字段数组
设置示例:
- curl http://127.0.0.1:9080/apisix/admin/routes/1 \
- -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
- -X PUT -d '{
- "methods": ["POST"],
- "uri": "/graphql",
- "vars": [
- ["graphql_operation", "==", "query"],
- ["graphql_name", "==", "getUser"]
- ],
- "upstream": {
- "nodes": {
- "192.168.1.200:1982": 1
- },
- "type": "roundrobin"
- }
- }'
复制代码 源码位置:
- 焦点 GraphQL 分析逻辑在 apisix/core/graphql.lua 或干系模块中
- 路由匹配逻辑在 apisix/http/router.lua 或 apisix/core/matcher.lua 中集成
2. graphql-proxy-cache 插件(独立插件)
这是一个独立的缓存插件,专门用于缓存 GraphQL 查询相应。
紧张功能:
- 缓存 GET 和 POST 的 GraphQL 哀求
- 基于 MD5 算法天生缓存键
- 支持磁盘和内存缓存
- 自动绕过包罗 mutation 操纵的哀求
插件文件位置:
- apisix/plugins/graphql-proxy-cache.lua
复制代码 3. degraphql 插件(REST 转 GraphQL)
这是从 APISIX 3.2.0 LTS 开始新增的插件,用于将 RESTful 哀求转换为 GraphQL 查询。
紧张功能:
- REST API 到 GraphQL API 的转换
- 哀求验证和查询分析
- 相应转换
插件文件位置:
- apisix/plugins/degraphql.lua
复制代码 为什么在源码中找不到 graphql.lua?
大概缘故原由:
- 版本差异:差异 APISIX 版本的构造结构大概差异
- 功能集成:GraphQL 焦点分析功能大概被集成到其他模块中
- 插件定名:干系功能大概以其他名称存在
查找发起:
- # 在 APISIX 源码目录中搜索 GraphQL 相关文件
- find . -name "*.lua" -type f | xargs grep -l "graphql" | grep -v test
- # 可能的文件位置
- ./apisix/core/graphql.lua # 核心 GraphQL 解析库
- ./apisix/plugins/graphql-proxy-cache.lua # 缓存插件
- ./apisix/plugins/degraphql.lua # REST 转 GraphQL 插件
- ./apisix/http/router.lua # 路由匹配(集成 GraphQL 支持)
复制代码 现实利用场景
场景1:基于 GraphQL 属性的路由控制
- {
- "uri": "/graphql",
- "vars": [
- ["graphql_operation", "==", "mutation"],
- ["graphql_root_fields", "has", "deleteUser"]
- ],
- "plugins": {
- "authz-keycloak": {
- "permission": "user:delete"
- }
- }
- }
复制代码 场景2:GraphQL 查询缓存
- {
- "plugins": {
- "graphql-proxy-cache": {
- "cache_ttl": 300,
- "cache_key": ["$query", "$variables"],
- "cache_strategy": "memory"
- }
- }
- }
复制代码 场景3:REST 接口袒露为 GraphQL
- {
- "plugins": {
- "degraphql": {
- "query": "query($id: ID!) { user(id: $id) { name email } }",
- "variables": ["id"],
- "upstream": {
- "url": "http://user-service/graphql"
- }
- }
- }
- }
复制代码 总结
功能范例实现方式文件位置阐明路由匹配焦点功能apisix/core/graphql.lua内置 GraphQL 分析和属性匹配查询缓存独立插件apisix/plugins/graphql-proxy-cache.luaGraphQL 相应缓存REST 转换独立插件apisix/plugins/degraphql.luaRESTful API 转 GraphQL权限控制Serverless 插件自界说 Lua 脚本基于 GraphQL 操纵的白名单发起:
- 查抄你的 APISIX 版本是否包罗 degraphql 插件(3.2.0+)
- 确认 graphql-proxy-cache 插件是否已编译到你的 APISIX 中
- 检察 apisix/core/ 目次下的 GraphQL 干系焦点模块
如果你确实须要 graphql.lua 文件,大概须要:
- 从官方堆栈的对应版天职支查找
- 查抄是否被重定名或重构到其他模块
- 思量利用上述的更换方案实现你的需求
postman中测试
graphql-lua库
你提到的 graphql-lua 库(bjornbytes/graphql-lua)与 APISIX 中的 GraphQL 支持有明白的层级关系和功能定位区别。
1. graphql-lua 库:底层 GraphQL 分析引擎
作用:
这是一个独立的 Lua GraphQL 实现库,提供 GraphQL 的焦点功能:
- 语法分析:分析 GraphQL 查询语句
- 范例体系:界说 GraphQL Schema 和范例
- 查询实行:实行 GraphQL 查询并返回结果
- 验证:验证查询的正当性
源码结构:
- graphql/
- ├── execute.lua # 查询执行
- ├── parse.lua # 语法解析
- ├── schema.lua # Schema 定义
- ├── types.lua # 类型系统
- ├── validate.lua # 查询验证
- └── ...其他模块
复制代码 独立利用示例:
- local graphql = require('graphql')
- local schema = graphql.Schema{
- query = graphql.ObjectType{
- name = 'Query',
- fields = {
- hello = {
- type = graphql.String,
- resolve = function() return 'world' end
- }
- }
- }
- }
复制代码 2. APISIX 中的 GraphQL 支持:集成应用层
关系:
APISIX 内部依赖 graphql-lua 库来实现 GraphQL 分析功能。
集成方式:
- 焦点路由匹配:APISIX 利用 graphql-lua 分析哀求,提取 graphql_operation、graphql_name 等属性举行路由匹配
- 插件扩展:基于分析结果实现缓存、转换、安全控制等高级功能
APISIX 源码中的集成点:
- # 可能的位置
- apisix/core/graphql.lua # APISIX 对 graphql-lua 的封装
- apisix/http/router.lua # 路由匹配逻辑(调用 graphql 解析)
复制代码 3. 两者区别对比
维度graphql-lua 库APISIX GraphQL 支持定位底层 GraphQL 分析引擎API 网关的 GraphQL 功能集成功能语法分析、范例体系、查询实行路由匹配、流量控制、安全计谋利用场景任何须要 GraphQL 的 Lua 项目API 网关层的 GraphQL API 管理输出GraphQL 查询结果路由决议、插件实行结果依赖关系独立库依赖 graphql-lua 作为分析引擎4. 现实工作流程
当客户端发送 GraphQL 哀求到 APISIX:- 客户端请求
- ↓
- APISIX 接收请求
- ↓
- 调用 graphql-lua 解析请求体
- ↓
- 提取 graphql_operation、graphql_name 等属性
- ↓
- 基于属性进行路由匹配
- ↓
- 执行相关插件(缓存、认证、限流等)
- ↓
- 转发到上游服务
复制代码 5. 为什么在 APISIX 3.10 源码中看不到 graphql.lua?
大概缘故原由:
- 模块化重构:GraphQL 功能大概被重构到多个模块中
- 依赖管理:graphql-lua 大概作为外部依赖,不在主代码库中
- 版本差异:差异版本的 APISIX 集成方式大概差异
验证方法:
- # 检查 APISIX 的依赖声明
- find . -name "*.rockspec" -o -name "Makefile" -o -name "requirements.txt"
- # 搜索 GraphQL 相关代码
- grep -r "graphql" --include="*.lua" apisix/
复制代码 6. 开发发起
如果你须要:
- 在 APISIX 中扩展 GraphQL 功能:
- 利用现有的 graphql_operation、graphql_name 等路由属性
- 开发自界说插件,利用 APISIX 的插件框架
- 在 Lua 项目中实现 GraphQL 服务:
- 直接利用 graphql-lua 库
- 示例:luarocks install graphql-lua
- 调试 APISIX 的 GraphQL 分析:
- # 启用调试日志
 - curl -X PUT http://127.0.0.1:9080/apisix/admin/plugin_metadata/debug \
- -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
- -d '{"log_level": "debug"}'
复制代码 总结
graphql-lua 是底子工具库,提供 GraphQL 的焦点分析本领;而 APISIX 的 GraphQL 支持是应用层集成,在底子分析之上构建了 API 网关所需的路由、安全、监控 等高级功能。
这种分层筹划是范例的软件架构模式:底层库专注单一功能,上层体系集成多个底层库实现复杂业务逻辑。APISIX 通过集成 graphql-lua,克制了重复造轮子,同时专注于 API 网关的焦点代价。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |