写点什么

谈谈 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:594461
用户头像

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

关注

评论

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

原生APP开发的优点

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包公司

当数字孪生遇见碳中和:西门子 Xcelerator给企业转型带来“新武器”

科技热闻

原生 APP 开发的方法

北京木奇移动技术有限公司

软件外包公司 APP外包公司 APP开发公司

不同规模的企业组网方案选择指南:从初创到集团

Ogcloud

组网 组网网络 企业组网 办公网络

泛微亮相鸿蒙生态峰会:共建协同管理基石,助推数智办公“新样板”涌现

最新动态

检测IP质量时除了纯净度,还需要注意这些问题!

kookeey严选代理

代理IP 测试环境 住宅ip 独享代理

掌握设计模式--策略模式

不在线第一只蜗牛

设计模式

iVX 开源:解码软件生态进化新密码

代码制造者

开源 redis图形化界面

大数据从业者必知必会的Hive SQL调优技巧

京东科技开发者

java浅拷贝BeanUtils.copyProperties引发的RPC异常

京东科技开发者

2025最新TikTok运营IP配置指南

Ogcloud

云手机 tiktok运营 海外IP 原生IP 本地IP

无缝适配!天翼云助力用户一键体验Qwen3

科技热闻

谷歌报告:76% 的开发者依赖 AI 工具完成编写、解释代码等任务

飞算JavaAI开发助手

Databend 产品月报(2025年4月)

Databend

端到端观测分析:从前端负载均衡到后端服务

观测云

可观测性

iVX:全场景数字化转型的技术重构

代码制造者

工业互联网 智慧城市 元宇宙

Go语言入门:(一)环境安装

北桥苏

GO语言编程

AI 智能体开发框架的特点

北京木奇移动技术有限公司

AI大模型 AI智能体 软件外包公司

Bolt.diy 评测方案:从部署到创意实践的全方位探索

穿过生命散发芬芳

DeepSeek Bolt.diy

五一劳动节|致敬平凡而伟大的劳动者

中烟创新

原生 APP 开发的测试

北京木奇移动技术有限公司

软件外包公司 APP外包公司 APP开发公司

【华为云MySQL技术专栏】Binlog压缩:节省存储,优化网络,提升性能

华为云开发者联盟

华为云 #Mysql

AI 工具选型误区:为什么 “功能多” 不等于 “适合你”?

飞算JavaAI开发助手

虚拟云环境中的高性能块设备:并行文件系统比较

Sergey Platonov

storage 高性能计算,

Java中的多态与继承

码语者

Java

NotebookLM 音频概览支持中文;扎克伯格 LlamaCon 发言:语音当下被低估了,未来语音交互将占据更大比重丨日报

声网

如何写出一份优秀的简历?

安全乐谷

面试 找工作 招聘 找实习

百度智能云千帆正式上线Qwen3系列模型

科技热闻

AI 时代程序员生存指南:掌握工具者掌控职场主动权

飞算JavaAI开发助手

为什么 Go 开发者开始用 AI 写 Java?跨语言代码生成的隐藏技能与行业变革

飞算JavaAI开发助手

镜舟科技出席工业软件创新暨开源峰会,分享开源创新与生态协同实践

镜舟科技

AI 开源生态 工业软件 镜舟科技 生态协同

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