HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

谈谈 GraphQL 的历史、组件和生态系统

  • 2019-08-30
  • 本文字数:3374 字

    阅读完需:约 11 分钟

谈谈 GraphQL 的历史、组件和生态系统

多年来,RESTful web 服务一直在为简单查询结构提供基本支持。但是,这些服务没有提供对数据的细粒度控制,从而允许开发人员可以灵活运用而无需创建大量不必要的调用。


GraphQL最初由 Facebook 构建,它是用于 API 的查询语言,允许开发人员选择他们想要发出的请求类型,并在单个请求中接收所需的信息。


我在本文中将解释GraphQL是什么、它是怎样开始的以及它如何成为开发人员构建 API 的基本工具。我们还将介绍 GraphQL 的关键组件以及 GraphQL 生态系统中的主要参与者。


让我们开始吧!

GraphQL 是什么?

按其最简单的形式来看,GraphQL 是一种开源语言,用于从客户端应用程序查询数据库。


GraphQL的联合创建者Dan Schafer 认为:


“GraphQL 是一种查询语言,用于我们在客户端和服务器之间转移合约的 API,允许服务器说‘这些是我公开的能力’,并允许客户端以一种方式来描述它们的要求,而这种方式最终使产品开发人员能够构建其希望创建的产品。”


在后台,它告诉 API 如何把检索到的数据呈现给客户端。这使开发人员能够发出精确的数据请求,以便他们接收的就是他们需要的东西——不多也不少。


以下是 GraphQL 为开发人员提供的主要好处:


  • 准确地声明他们需要服务器所提供的内容,并以可预测的方法来接收请求的数据。

  • 在单个请求中从服务器检索多个资源。

  • 它是强类型的,也即:其允许 API 用户知道(1)有哪些数据可用,以及(2)数据以什么形式存在。


一个 GraphQL 查询本质上是一个字符串,发送该字符串到服务器后,返回 JSON 文件到客户端。这些查询快速应答了它们的响应,因此容易预测运行查询返回的数据的形状。另外,如果开发人员知道其应用程序所需数据的类型,那么,编写查询也就容易了。


与 RESTful 服务或 SQL 中复杂的连接语句不同,GraphQL 是分层的。这意味着,其遵循对象之间的关系,适用于分层用户界面使用的图形结构数据。


GraphQL 利用现有代码,而不是命令或提供数据存储。它意味着可以查询 GraphQL 服务器支持的类型,使得在这些信息之上构建工具变得容易。


借助 GraphQL,返回数据的形状完全取决于客户端的查询。因此,可以容易地给服务器添加其他字段(比如,在添加新产品功能的时候),而不会影响现有的客户端。反之亦然。因此,当我们不再使用旧功能时,相关的服务器字段将继续工作,即使它们被弃用了。这样,GraphQL 带来了向后兼容过程,不再需要增加版本号,这个功能很酷。


现在,我们对GraphQL是什么有了更好的理解,我们赶快来看看这一切是怎样开始的吧。


构建一个带数据库的即时GraphQL API,并开始探索一下这项技术的工作原理。

这一切是怎样开始的

GraphQL 是怎样开始的?在 GraphQL 出现之前,开发人员在使用什么?它给他们带来了哪些限制?让我们来找出答案!

GraphQL 是怎样开始的?

向移动的转变

GraphQL 的起源可追溯到这个行业向移动的转变。当时,Facebook 的移动战略(即,在移动设备上采用 HTML5)由于网络的使用量过高而未能实现。结果,Facebook 决定使用原生技术从头构建 iOS 应用程序。


在移动端实现 Facebook 新闻推送的是一个主要问题。这不是像获检索一个故事、作者、故事的内容、评论列表和喜欢该文章的人这么简单。每个故事都相互关联、嵌套和递归的。现有的 API 没有被设计成允许开发人员在移动设备上展示一个丰富、类似新闻推送的体验。它们没有层次性,允许开发人员选择他们所需要的,或有显示异构推送故事列表的能力。


在 2012 年,Facebook 决定,他们需要构建一个新的新闻推送 API,以构建 Facebook 的移动应用程序。这就是 GraphQL 开始成形的时间,并且,在 8 月中旬,Facebook 发布了采用新 GraphQL 技术的 iOS5.0 应用程序。它允许开发人员通过利用其数据获取(data-fetching)功能来减少网络的使用。在接下来的一年半时间里,除了新闻推送外,GraphQL API 扩展到大多数的 FacebookiOS 应用程序。在 2015 年,GraphQL 规范首次与 JavaScript 中的引用实现一起发布。

传统 REST API 的局限性

传统 REST API 的主要问题是速度慢以及需要硬编码(hard-coding)。加快速度的一种可能解决方案是创建多个端点。但是,当我们把这个外推以覆盖所有数据来源和 API 客户端应用程序所需,我们就遇到了 REST API 的局限性问题。


让我用个类比来解释一下传统 REST API 的局限性。


比方说,我们有台自动售货机。在传统的 REST 里,我们在自动售货机上按一个按钮就会得到一样东西。因此,我们必须一次按多个按钮才能得到我们需要的所有东西,这个过程很慢。


但是,如果我们有个特殊用途的按钮,按它一次就可以得到多样东西。因此,比如,我们能够按一次一个特殊用途的按钮,就从自动售货机那里得到 4 样东西。


把这两种方法混合一下以获得这么一台自动售货机,我们可以以组合方式按下我们需要的按钮就可以一次性得到我们想要的一切。这就是 GraphQL 在做的。


GraphQL 旨在通过拥有一个“智能”节点而不是很多“愚蠢的”节点来解决这些问题。关键的好处在于,智能节点能够执行复杂的查询,并按客户端的要求形成输出的数据。


本质上,GraphQL 层存在于客户端和数据源之间。其任务是接收客户端请求,并根据客户端的要求获取必要的数据。简而言之,GraphQL 查询方法解决了广泛的大规模应用程序开发问题。

GraphQL 是如何流行开来的

正如我们可以想象的,业界已经存在对像 GraphQL 这样的解决方案的需求,这就是它这么快就流行起来的原因。在头 6 个月中,在不同编程语言中就都实现了 GraphQL,这些编程语言包括 PHP、JavaScript、Scala、Python 和 Ruby。


当新公司和爱好者开始构建它时,它就流行开来。最终,在 2016 年, 更大的公司开始采用该技术,从 GitHub 开始,然后是推特、Yelp、《纽约时报》、Airbnb 等公司。

GraphQL 的主要组件

实际上,GraphQL API 使用了 3 个主要的组件:


  • 查询查询是客户端发出的请求,查询字段可以指向数组及支持参数。

  • 解析器。除非我们告诉 GraphQL 服务器该做什么,不然它不知道如何处理它得到的查询。 这个工作是用解析器来完成的。简单地说,解析器告诉 GraphQL 如何(及从何处)获取与特定字段对应的数据。借助 GraphQL,我们使用的 API 模式和数据库模式是解耦的。这允许我们使用它们作为变更解析器来修改我们数据库的内容。

  • 模式。GraphQL 模式描述了客户端一旦连接到 GraphQL 服务器就可以使用的功能。模式中的核心构建块被称为类型。

GraphQL 生态系统

现在,我们来快速浏览一下 GraphQL 生态系统中的主要参与者。

GraphQL 服务器

由于 GraphQL 只是个规范,因此,我们需要一些 GraphQL 服务器实现才能开始。


  • GraphQL-JS是 GraphQL 原始参考实现,可以与Express一起使用。

  • GraphQL-Server是 Apollo 的一体式 GraphQL 服务器实现,正在迅速获得关注。它可以从任何 GraphQL 客户端查询。

  • GraphQL-Severless是 Back4App 即时 GraphQL API,完全集成了数据库(MongoDB)及云函数(Cloud Functions)。我们可以作为提供 GraphQL API 的服务访问后端。

  • GraphQL Yoga是构建于 Express 和 Apollo 服务器上的 Prisma 的服务器实现。

GraphQL 客户端

尽管我们可以直接查询我们的 GraphQL API,但是,拥有一个专用的客户端库肯定会让事情变得更容易。


  • Relay是 Facebook 的 JavaScript 库,用以使用 GraphQL 构建 React 应用程序。

  • Apollo Client缓存请求并正则化数据,从而节省网络流量。它还支持分页、预取数据以及数据层和视图层之间的连接。

GraphQL 网关

最流行的 GraphQL 网关可能是Apollo Engine。其功能包括:查询执行跟踪、查询缓存、错误跟踪和 API 性能趋势分析。

开源应用程序和工具

以下是一些使用了 GraphQL 的开源应用程序:


  • 由 GraphQL 提供支持,Gatsby能够从多个 GraphQL API 获取数据,并用来创建静态的供客户端使用的 React 应用程序。

  • VulcanJS利用 GraphQL,以允许用户快速地构建 CRUD 应用程序。

  • GraphQL Playground是个功能强大的 IDE,可以为 GraphQL 查询、变更、订阅、验证等打包编辑器。它允许开发人员可视化模式的结构。

  • GraphiQL是个内嵌于浏览器的 IDE,可以和 GraphQL API 进行交互,支持数据查询、执行变更及自动完成查询。

结论

尽管 GraphQL 的构建是用来解决 Facebook 针对 iOS 应用程序新闻推送 API 的一个非常具体的问题,但是,它很快扩展到 Facebook 内部,解决了更多的问题,并且,最终进行了开源,目前有很多大的公司采用的工具。


原文链接:


What is GraphQL: History, Components, and Ecosystem


2019-08-30 09:594227
用户头像

发布了 199 篇内容, 共 85.2 次阅读, 收获喜欢 295 次。

关注

评论

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

太牛了!腾讯T9耗时69天整理出最全架构师进阶核心知识点笔记

做梦都在改BUG

Java

如何在上架App之前设置证书并上传应用

雪奈椰子

惊喜!华秋DFM软件升级,新功能让你爱不释手

华秋电子

软件测试的分类

测吧(北京)科技有限公司

测试

软件测试 | 软件需求的层次

测吧(北京)科技有限公司

测试

软件测试生命周期

测吧(北京)科技有限公司

测试

软件测试 | 测试计划目标

测吧(北京)科技有限公司

测试

太香了!Alibaba内部架构师进阶指南,理论+实践双飞

做梦都在改BUG

Java 架构

500行代码代码手写docker-将rootfs设置为只读镜像

蓝胖子的编程梦

Docker 云原生 k8s #k8s Docker 镜像

软件测试 | 不合格需求分析的风险

测吧(北京)科技有限公司

测试

再获工信部认可!海泰方圆方案获评“2022年信息技术应用创新解决方案”

电子信息发烧客

JVM—解析运行期优化与JIT编译器

做梦都在改BUG

Java JVM JIT

四川师范大学何云:事项法会计从五大方面助力企业创造价值

用友BIP

智能会计 价值财务 事项法会计

5000 字手把手实战|Kubernetes+极狐GitLab CI,获得极致 CI/CD 体验

极狐GitLab

Kubernetes DevOps 微服务 k8s CI/CD

软件测试 | 模块化与模块独立性

测吧(北京)科技有限公司

测试

如何通过财务共享推进财务精细化管理

用友BIP

财务共享

秒杀系统常见问题—如何避免库存超卖?

做梦都在改BUG

秒杀系统 电商超卖

国内半导体分立器件逐步向高端应用市场推进,未来可期

华秋电子

软件测试 | 编写软件测试计划的注意事项

测吧(北京)科技有限公司

测试

华为云CodeArts Snap 智能编程助手PyCharm插件安装与使用指南

华为云PaaS服务小智

编码 插件 智能编程

重塑DeFi:深入了解Solaris Network

西柚子

开发敏捷高效 | 云原生应用开发与运维新范式

CODING DevOps

浅析财务共享各阶段面临的挑战

用友BIP

财务共享

开发敏捷高效 | 云原生应用开发与运维新范式

CODING DevOps

DevOps 云原生 CODING DevOps 开发运维 敏捷高效

厦门狄耐克:助推智慧医疗,需要夯实自身的技术底座

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

专业解读财务共享实现财务数智化转型的有效路径

用友BIP

财务共享

更快速、更高效的键盘操作方式尽在Superkey Mac版~

真大的脸盆

Mac Mac 软件 键盘增强软件

软件测试的误解有哪些?

测吧(北京)科技有限公司

测试

低代码平台简介(10家国产化低代码平台详细介绍)

优秀

低代码开发平台 低代码平台

腾讯安全携手行业伙伴,详解攻击面管理(ASM)核心能力

Geek_2d6073

软件测试/测试开发丨App自动化测试高级定位技巧

测试人

程序员 软件测试 自动化测试 测试开发

谈谈 GraphQL 的历史、组件和生态系统_语言 & 开发_Brenda Clark_InfoQ精选文章