最近 Facebook开源了 GraphQL,它驱动了日均数十亿次的 API 调用,同时围绕它还形成也一个社区 graphql.org ;
一个 GraphQL 查询是一个字符串,它被发送给一个与数据模式无关的服务器,然后服务器返回 JSON 数据。GraphQL 是强类型的,并避免了版本控制,同时提供了随着数据演进可以轻易改进查询语句的能力。
InfoQ 找到了 Lee Byron,他在 Facebook 工作同时也是 GraphQL 的早期贡献者。
InfoQ:GraphQL 已经出现几年了。您能简要介绍一下它的历史和 Facebook 在进军移动计算的时候 GraphQL 是如何产生的?
Lee Byron:Facebook 最初作为一个网站被深深嵌入到我们原有的技术架构中。直到 2012 年,信息流都只能请求并从服务器以 HTML 的形式返回。在将信息流重建为以 iOS 原生 view 的形式进行展示的过程中,我们不得不重新改造这个架构来获得原始数据。
我们重新写了一个系统,它看起来非常像一个传统的基于 REST 的服务器,但作为 iOS 开发者发现它使用不便,并且我们看到了通过一个请求加载所有的信息同时使得我们的 REST 资源保持隔离之间的冲突。
特别是被分享的信息流故事和信息流故事的聚合体(它们本身就可能是被分享的信息流故事和信息流故事的聚合体)迫使我们不得不面对这个问题,使得我们重新思考如何去请求数据。
最终,在弄清楚信息流的原始数据应该如何处理以及确定通过移动网络请求数据的最佳方式的努力中,就产生了 GraphQL。
InfoQ:数据在本质上是分层的,同时它也是关系图。GraphQL 的中心目标是来表达这种图形关系吗?这种语言的其它目的是什么?
Lee Byron: 当然,我们觉得很奇怪,我们的应用程序的服务器代码以对象和关系的形式处理数据,然后以扁平的表格来表示它,后来才通过移动客户端的代码将它变回对象和关系。GraphQL 的早期目的 是以清晰和易于使用的目标来暴露服务器的数据。
GraphQL 还有其他几个重要的目的。它的设计是为了满足产品和创建它们的开发者的要求,而不是为了模拟一些数据库或满足传输语义。这有助于使 GraphQL 易于学习和使用,但它没有抽象任何特定数据库或传输方式以允许不同的方式来使用它。它同时也是强静态类型的,这有助于促进各信息设计的规则,并且支持很多类似错误检查、IDE 集成和代码生成有趣的工具。
InfoQ:服务器中的数据格式或服务器中的数据存储对 GraphQL 有没有影响?
Lee Byron: 没有。 GraphQL 不是像 MySQL 或 Redis 这样直接面向数据的接口,而是面向你已经存在的应用代码的接口。你可以把 GraphQL 看作是为了调用应用服务器上的方法的一些内嵌的 RPC。
InfoQ:你毫无顾忌地谈论以产品为中心来帮助 UI 开发者?REST 和 JSON 是否依然有意义以及不关心 UI 的中间件开发者如何使用它?
Lee Byron: 我认为以产品为中心帮助的不仅仅是用户界面开发。在 Facebook,GraphQL 在服务器代码中是一个真正强大的力量。JSON 肯定还是有意义的,它是 GraphQL 的主要传输方式。在 Facebook,我们构建产品时,GraphQL 取代了 REST,但是在提供公共 API 时 REST 仍然是一个有用的工具。
InfoQ:什么是 GraphQL 服务器?你能否详细说明一下强类型和 GraphQL 的路线图。目前缺少什么?
Lee Byron: 该 GraphQL 服务器的代码相对小一点 ; 它负责几件事情。它提供了定义你的类型系统和与服务器代码交互的工具。它接受 GraphQL 查询并且将验证他们以确保可以安全地和明确地在你的类型系统内运行。然后当然,它会依照你在你的类型系统内定义的代码来执行查询,这些代码可能是处理同步、并行和错误捕获的一些工作。
路线图之前还有两个方面需要解决。第一,需要更好地工具来帮助客户端开发者做一些类似于代码生成和查询管理之类的事情。Relay 是我们首要的和最显著的客户端工具。其次,在 GraphQL 中更好地支持流数据和推送的数据。在 Facebook 我们一直在探索这些领域并很高兴能够在未来分享我们的成功经验。
InfoQ:除了 Facebook,你可以说几家已经在使用 GraphQL 的公司,以及社区有多强大?什么是 Nuclide?开发者应该注意哪些其他的工具?
Lee Byron:GraphQL 仍然是一个新兴的技术。我们只在几个月前发布 GraphQL 的预览版,从那时起,我们已经看到了很多大大小小的公司的兴趣。Red Badger,总部设在英国的顾问公司,在开发金融时报的应用程序时已经使用了 GraphQL。 Reindex.io 是一个新公司,它将 GraphQL 作为一种服务提供给开发者。社区不仅仅使用 GraphQL,同时也创建它。我们几个月前发布了一款 GraphQL 的 JavaScript 版本,自那时以来,社区成员已经建立 GraphQL 的 Ruby、Java、Scala、.NET 和 Python 版本。我很高兴能在这样短的时间有这样的进展情况。
Nuclide 是 Facebook 的开发早期的 React Native 的 IDE,它使用了 Github 的 Atom 编辑器。React、Relay 和 React Native 都是非常有趣的工具,它们在产品工程领域提供了新的视角。 DataLoader 是我们最近发布的另一个工具,它包含了我们在 Facebook 使用了数年的模式并帮助我们构建了效率很高的 GraphQL 服务器。
感兴趣的读者不妨移步这里了解如何上手。
查看英文原文: Facebook Open Sources Data Query Language GraphQL 。
感谢张龙对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论