用了6个月的GraphQL,真香!

2020 年 6 月 14 日 InfoQ


作者 | Manish Jain
策划 | 万佳
本文作者用 GraphQL 在后端做了 6 个月的项目,分享了自己体验 GraphQL 的优点和缺点。作者认为 GraphQL 提供的灵活性让其缺点不足为道,强烈建议使用 GraphQL 作为 REST API 的替代品。

GraphQL 是一种用于 API 的查询语言,同时基于你的现有数据来执行这些查询的服务端运行时。它为 API 中的数据提供了一套易于理解的完整描述,并让客户端能准确地获得它们所需的查询内容,且不会附带任何冗余信息。

最初,GraphQL 只是 Facebook 为其移动 APP 开发的内部解决方案,后来向社区开源。

1优点
 实用的数据交换

使用 GraphQL 时,开发者可以根据客户端需要的字段对查询进行灵活定义,这种“量体裁衣式”的自定义非常实用,而且执行起来十分简单。如果前端需要一个人的“名字”和“年龄”,GraphQL 就能只对这两个字段进行查询。而这个人的“姓”和“地址”就不会在该查询的响应中被发送。

 使用数据加载器来减少网络调用

尽管 GraphQL 库本身并不包含数据加载器(Dataloader),但是数据加载器的确是一个非常实用的程序库,可以用来解耦你的 APP 中互不相关的部分,还不会牺牲批处理数据加载的性能。虽然数据加载器提供了一个加载单个值的 API,但所有并发请求将被组合起来并提交给你的批处理加载函数。这就能让你的 APP 在整个应用程序中安全地执行分布式数据获取。

举个例子:在上述例子的基础上,这次我们从另一个叫做“交易服务”的服务中获取一个“人”的“银行信息”,这时后端可以从“交易服务”中获取相关的“银行信息”,然后将这个结果与这个“人”的“名字”和“年龄”捆绑在一起,再将这些信息资源作为响应发送回去。

 在公开数据和数据库模型之间进行解耦

GraphQL 的一大优点是能以解耦的方式将数据库建模数据对用户进行选择性地公开。这样,在对持久层(persistence layer)进行设计时,我们可以在聚焦于该层需求的同时,兼顾考虑怎样才是向外部世界公开数据的最佳方式。该功能还能与数据加载器联合起来使用,因为你可以在将数据发送给用户前将这些数据组合在一起,这样一来为公开数据设计模型就会变得非常容易。

 摆脱 API 版本控制的烦恼

API 版本控制是一个经常遇到的问题。一般而言,通过在相同的 API 前面添加一个 v2 标签来添加一个新版本去解决这个问题,这是相当简单的解决方案。但使用 GraphQL 时,情况就大不相同了,尽管你还是可以使用上述解决方案来处理这个问题,但这并不符合 GraphQL 的自由精神。GraphQL 文档明确指出,你应该升级你的 API,这意味着在不破坏原 API 的情况下向现有端点添加更多字段。前端仍然可以使用相同的 API 进行查询,并且在需要时请求新字段。就是这么简单。

这个特性在与前端开发团队协作时非常有用。由于设计更改,前端团队可以请求添加所需要的新字段,而后端团队能轻松地实现该字段的添加,且不会扰乱现有API。

 前后端团队独立开发

使用 GraphQL,前端和后端团队能彼此独立地工作。由于 GraphQL 包含严格类型定义的 schema,前后端团队可以互不干扰地并行工作。

首先,前端团队甚至在无需查看代码的情况下,就能很容易地从后端生成 schema。而这个生成的 schema 可以直接用于查询的创建。

其次,前端团队还可以一直使用 API 的 mock 版本进行开发工作。他们还能用 mock 版本来测试代码。这为开发人员提供了相当令人愉悦的体验,且完全不会对他们的开发工作造成任何妨碍。

2缺点
 并不是所有的 API 都可以升级

有时,由于来自业务或设计的变化日积月累,迫使 API 的实现需要完全更改。在这种情况下,你将不得不依赖旧的方法来进行 API 版本控制。

 难维护的代码

我遇到过好几次,在使用数据加载器获取数据时,代码有时会分散到多个地方,这对代码的维护带来一些困难。

 响应时间长

由于查询可以不断升级并变得非常庞大,这有时会影响查询的响应时间。要避免这种情况,请确保让响应资源保持简洁。这方面的指南,请查看 Github GraphQL API。

https://developer.github.com/v4/

 缓存困难

通常对一个 API 响应进行缓存的主要目的是能更快地从未来的请求中获得响应。与 GraphQL 不同,REST API 所利用的是将缓存内置于 HTTP 技术规范中。正如前面提到的,一个 GraphQL 查询可以请求资源的任何字段,这就使得在 GraphQL 里使用缓存天生就很困难。

3结论

我个人强烈推荐使用 GraphQL 作为 REST API 的替代品。GraphQL 所提供的极大灵活性让它的缺点瑕不掩瑜。当然这里提到的优点和缺点可能并不总是适用于所有应用场景,但是值得在决定是否使用 GraphQL 时纳入考虑,希望我所提供的这些意见能对你的项目有所帮助。

参考阅读:

https://levelup.gitconnected.com/6-months-of-using-graphql-faa0fb68b4af


InfoQ 读者交流群上线啦!各位小伙伴可以扫描下方二维码,添加 InfoQ 小助手,回复关键字“进群”申请入群。大家可以和 InfoQ 读者一起畅所欲言,和编辑们零距离接触,超值的技术礼包等你领取,还有超值活动等你参加,快来加入我们吧!



点个在看少个 bug 👇

登录查看更多
0

相关内容

应用程序接口(简称 API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。
【清华大学】图随机神经网络,Graph Random Neural Networks
专知会员服务
155+阅读 · 2020年5月26日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【复旦大学-SP2020】NLP语言模型隐私泄漏风险
专知会员服务
24+阅读 · 2020年4月20日
【ICLR2020-哥伦比亚大学】多关系图神经网络CompGCN
专知会员服务
49+阅读 · 2020年4月2日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
数据库之架构:主备+分库?主从+读写分离?
架构文摘
8+阅读 · 2019年4月23日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
从零开始用Python写一个聊天机器人(使用NLTK)
AI研习社
10+阅读 · 2018年12月27日
干货 :数据分析师的完整流程与知识结构体系
数据分析
8+阅读 · 2018年7月31日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
郑建华院士:解读人工智能与信息安全
未来产业促进会
4+阅读 · 2018年5月10日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
Arxiv
7+阅读 · 2018年11月6日
Arxiv
24+阅读 · 2018年10月24日
Arxiv
23+阅读 · 2018年10月1日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
5+阅读 · 2017年10月27日
VIP会员
相关VIP内容
【清华大学】图随机神经网络,Graph Random Neural Networks
专知会员服务
155+阅读 · 2020年5月26日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【复旦大学-SP2020】NLP语言模型隐私泄漏风险
专知会员服务
24+阅读 · 2020年4月20日
【ICLR2020-哥伦比亚大学】多关系图神经网络CompGCN
专知会员服务
49+阅读 · 2020年4月2日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
相关资讯
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
数据库之架构:主备+分库?主从+读写分离?
架构文摘
8+阅读 · 2019年4月23日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
从零开始用Python写一个聊天机器人(使用NLTK)
AI研习社
10+阅读 · 2018年12月27日
干货 :数据分析师的完整流程与知识结构体系
数据分析
8+阅读 · 2018年7月31日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
郑建华院士:解读人工智能与信息安全
未来产业促进会
4+阅读 · 2018年5月10日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
相关论文
Top
微信扫码咨询专知VIP会员