YuanZhea 2015-12-30
一个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服务器。