阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

谈谈 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


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

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

关注

评论

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

SpringBoot+Vue+Flowable,模拟一个请假审批流程!

江南一点雨

Java spring springboot flowable

分享几个自动化测试的练手项目

和牛

自动化 软件测试 8月月更

烟雾、空气质量、温湿度...自己徒手做个环境检测设备

华为云开发者联盟

开发 传感器 环境监测

异形屏为led显示行业带来更多希望

Dylan

LED显示屏 led显示屏厂家 异形屏

接口测试中,应不应该用数据库

和牛

8月月更

web技术支持| 基于vue3实现自己的组件库第三章:Checkbox组件

anyRTC开发者

Vue Web 音视频 WebRTC Checkbox组件

Python命令行输出彩色字符串

和牛

Python 8月月更

阿里面试官最新分享的Java面试宝典,含8大核心内容讲解

Java工程师

Java 面试 offer

requests库访问接口

和牛

测试 8月月更

聊聊云原生数据平台

观远数据

开源 云原生 8月月更

一张图快速了解 Istio 的 EnvoyFilter

万猫学社

云原生 istio envoy

怎么学自动化测试

和牛

自动化 软件测试 8月月更

自助服务知识库是什么?

Geek_da0866

在Istio中,到底怎么获取 Envoy 访问日志?

万猫学社

云原生 istio envoy

聚焦企业流程智能化发展新趋势,中国信通院2022 RPA创新产业峰会即将开启

王吉伟频道

RPA 机器人流程自动化 中国信通院 机器人开发 智能自动化

怎么设计产品手册?用什么设计产品手册?

Baklib

年薪60万+?这份10万字的面试突击宝典涵盖阿里 P5 工程师~P7 所有技术栈

了不起的程序猿

Java 阿里巴巴 架构 Java 面试 java程序员

开源一夏 | 使用 JavaScript 和 CSS 的简单图像放大镜

海拥(haiyong.site)

开源 8月月更

开源一夏 |Spring MVC深度学习

叶秋学长

spring 开源 8月月更

常用持续集成工具对比

和牛

软件测试 8月月更

如何搭建知识库,让您的内容更丰富?

Geek_da0866

8月Meetup | “数据调度+分析引擎”解锁企业数字化转型之路

Apache DolphinScheduler

干货:服务器网卡组技术原理与实践

C++后台开发

服务器 交换机 网卡 C/C++后台开发 C/C++开发

app自动化测试webview怎么操作

和牛

自动化 软件测试 8月月更

观测云入选 CNCF 云原生全景图

观测云

直播预告|从新手村到魔王城,高效默契的敏捷团队如何炼成

观测云

一种新的测试方法:视觉感知测试

和牛

软件测试 8月月更

不爱生活的段子手不是好设计师|ONES 人物

万事ONES

阿里总部最新分享SpringCloud 生态全栈笔记,涵盖了五大核心组件,太强了!

Java工程师

Java spring spring-cloud

【荣耀智慧服务】快捷服务开发指南

荣耀开发者服务平台

开发者 App 手机 荣耀 honor

开源生态与AI芯片的碰撞&Dragonfly基于P2P的镜像加速系统 | 第 39-40 期

OpenAnolis小助手

开源 dragonfly p2p 龙蜥社区 AI 芯片

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