GMTC北京站优惠购票最后一周!13个热点专题,50+大厂案例,这里一览 了解详情
写点什么

Facebook 开源数据查询语言 GraphQL

  • 2015 年 10 月 13 日
  • 本文字数:2170 字

    阅读完需:约 7 分钟

最近 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 读者交流群)。

2015 年 10 月 13 日 19:008957
用户头像

发布了 32 篇内容, 共 17.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

训练营第二周总结

Mr冰凉

重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

小傅哥

设计模式 小傅哥 重构 代码优化

0616作业2

Geek_10

程序员开发色情游戏,赴日寻找AV女优真人拍摄,结果...

程序员生活志

程序员 游戏开发

依赖倒置原则

Halley

设计原则之依赖倒置和接口隔离

林昱榕

极客大学架构师训练营 依赖倒置 设计原则 接口隔离

Libra教程之:来了,你最爱的Move语言

程序那些事

比特币 区块链 以太坊 libra blockchain

【架构师训练营】第2周总结

花生无翼

极客大学架构师训练营

架构师训练营第2周总结

Glowry

极客大学架构师训练营

极客大学架构师训练营--编程的未来 面向对象 依赖倒置原则 -- 第二次作业

John(易筋)

极客时间 极客大学 架构师 极客大学架构师训练营 依赖倒置原则

架构师训练营 - 第二周作业

Melo

小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列

程序那些事

Java JVM JIT 签约计划第二季

架构师训练营」第 2 周作业

edd

架构 极客大学架构师训练营

Libra教程之:运行自定义move modules

程序那些事

比特币 区块链 以太坊 libra blockchain

基于 Docker 实现 MySQL 主从复制

ytao

MySQL Dockerfile

架构师训练营-第二周-作业1

狂奔嘀兔纸

极客大学架构师训练营

极客大学架构师训练营 编程的本质与未来 第三课 听课总结

John(易筋)

极客时间 极客大学 架构师 极客大学架构师训练营 编程的未来

训练营第二周作业

Mr冰凉

一款开源的Diffy自动化对比测试框架:超详细实战讲解

狂师

开源 测试 测试驱动开发实战营 自动化测试

「架构师训练营」第 2周作业

旭东(Frank)

架构 极客大学架构师训练营

Week 02- 作业:设计原则

dean

极客大学架构师训练营

架构师训练营--第二周作业

_MISSYOURLOVE

极客大学架构师训练营 第二周作业

学习一下:我的学习之道

非著名程序员

学习 程序员 程序人生 提升认知

Libra教程之:Libra testnet使用指南

程序那些事

比特币 区块链 以太坊 libra blockchain

BAT面试题汇总:分布式+Dubbo +JVM+微服务+多线程+Spring附答案(建议收藏)

程序员生活志

Java spring 面试 分布式 mybatis

架构师实现自己架构的主要手段

_MISSYOURLOVE

极客大学架构师训练营

为什么 Vue 更符合这个时代的大势所趋

葡萄城技术团队

Vue SpreadJS

第二周总结

changtai

听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理

小林coding

面试 计算机网络 计算机基础

Redis系列之扫盲篇(一)

z小赵

Java 分布式 高并发系统设计

第二周作业

大雄

依赖倒置

金融行业数据库架构实践与运维

金融行业数据库架构实践与运维

Facebook开源数据查询语言GraphQL_语言 & 开发_Rags Srinivas_InfoQ精选文章