GraphQL与REST:为您的产品选择正确的API风格
REST与GraphQL之间的选择,是产品团队能做出的最重要的技术决策之一,通常在早期就需确定,而此时各种影响尚未完全显现。它影响团队增加功能的速度、外部客户集成的难易程度、系统的负载表现,以及随时间演进数据模型所需的工作量。
REST:成熟的标准
广为人知:每位开发者都用过REST API,约定俗成的规范(URL标识资源、HTTP动词表达操作、无状态请求/响应)直观且文档完善。
HTTP原生缓存:REST与HTTP语义的对齐意味着GET响应可由浏览器、CDN和反向代理原生缓存,无需额外基础设施。
工具成熟:OpenAPI/Swagger文档、Postman/curl测试、监控工具一应俱全,运营负担低。
按约定版本管理:通过URL路径(/api/v1/、/api/v2/)进行版本控制,模式成熟,工具齐备。
REST的缺点同样众所周知:过度获取(响应中返回超出需要的数据)和获取不足(需要多次请求才能组装完整视图)是REST以资源为中心的模型带来的结构性问题。随着产品演进,自定义端点数量激增,版本管理复杂度随之上升。
GraphQL:灵活性的代价
客户端精准请求所需数据:移动端和桌面端可向同一端点发起不同查询,各自仅获取与自身视图相关的字段,彻底消除过度获取问题。
单一端点与可自省的Schema:GraphQL API通过Schema自省实现自文档化,GraphiQL等工具让开发者可以交互式探索API,加速集成。
非常适合复杂数据图:当数据模型是富含关联实体的图结构时,GraphQL的查询语言远比REST的资源模型更具表达力。
强类型:GraphQL Schema是强类型的,在Schema定义阶段即可捕获集成错误,而非等到运行时,并赋能强大的开发工具。
GraphQL的缺点同样不可忽视:N+1问题(列表查询触发对每个条目的独立数据库查询)是解析器架构的根本挑战,需通过DataLoader等批处理模式显式缓解。字段级授权比REST端点级授权更为复杂。缓存更难实现,因为GraphQL请求通常是POST请求,HTTP缓存默认不缓存POST。对于GraphQL新手团队而言,学习曲线是真实存在的。
决策对Scrum团队API契约的影响
选用REST时,API契约由端点文档定义——可预期但适应变化较慢。选用GraphQL时,前端团队可以独立针对后端发布的Schema组合查询,无需后端为新的字段组合进行修改,这能大幅提升前端开发速度,尤其是前后端团队并行开发时。
一个实用的决策启发法:API简单、客户群多样且为外部用户、或HTTP缓存具有重要运营价值时,选REST;数据模型是复杂图结构、多种客户端需要同一数据的不同视图、或前端团队需要灵活迭代数据需求而不依赖后端配合时,选GraphQL。许多组织最终采用混合策略:REST用于简单、可缓存的对外端点,GraphQL用于复杂的内部数据访问层。
XNM咨询支持技术产品团队做出合理的架构决策,并构建高效的Scrum交付模式。了解我们的项目与计划交付服务,探索我们如何帮助技术团队以纪律和信心完成交付。