GraphQL最突出的架构优势是什么?

作者 | Khalil Stemmler

策划 | 田晓旭

在服务器上使用 GraphQL 代替 REST 是有很多好处的,使用 Apollo Client 取代自己编写的数据获取逻辑也有很多优势。在这篇文章中,我们主要讨论 GraphQL 最突出的架构优势。

本文最初发布于 khalilstemmler.com 网站,经原作者授权由 InfoQ 中文站翻译并分享。

在过去的几年中,我们已经看到各种规模和形态的公司都开始在整个组织中逐渐采用 GraphQL,例如 Expedia、Nerdwallet 和 Airbnb。在本文中,我们将讨论在未来或现有的项目中使用 GraphQL 都将享受哪些架构优势。

1六边形架构

Alistair Cockburn 在“六边形架构”中提到,我们架构的最内层是应用程序和域层。在这一层的外面是适配器(或端口)。

可以将端口视为“将外部世界连接到内部世界的一种方式”。外部世界有很多技术,我们可以在其之上构建应用程序。在外部,你能找到数据库、外部 API、云服务和种种内容。如果我们采用依赖倒置方法,就可以定义一些端口来将它们安全地包含在我们的应用程序中。端口是抽象、合约。它们通常以接口抽象类的形式出现。

Alistair Cockburn 的“六边形架构”

我非常赞同这种类型的架构,因为它使我们能够:

直到真正有必要做出决策时,才决定到底采用哪种类型的 Web 服务器、数据库、事务电子邮件提供商或缓存技术。在开发工作早期,我们完全可以使用一个端口的内存内实现。

通过依赖注入方法,这种架构还会让开发人员优先编写可以测试的代码。这样我们就可以尽可能地减少可能导致代码不可测试的具体依赖项。

最后,它将我们的关注点转向了应用程序和特定于域的内容。这些内容是不能直接从市场购买或下载的。

2基础架构组件

GraphQL 服务器和 HTTP 服务器都属于基础架构组件。

基础架构组件:构成 Web 应用程序基础的基本组件。根据整洁(或六边形)架构的思想,数据库、Web 服务器和缓存都是外层基础架构组件。

我们之所以将基础设施组件称为基础设施,是因为我们会在它们的基础上构建应用程序。在这一基础(即框架)内,我们编写丰富的、领域特定的应用程序。基础设施只是驱动程序而已。

基础架构组件的另一个主要特征是,它们不是我们项目开发工作的重心

基础架构组件是业界信任的一系列工具,我们只需对其配置即可使其正常工作。

GraphQL API 的配置工作包括:

安装 GraphQL

公开一个服务器端点

设计一个模式(schema)

将解析器连接到数据源

这是我们需要做的工作,但不是我们项目的工作重心

如果某项基础架构技术受到业界的信任,我们就可以选择用这种工具来完成任务,而不是开发自己的基础架构组件,这样就可以加快我们的开发速度。

考虑数据库。它们也是基础设施。

例如,Postgres 数据库是我们可以用于新项目的几个数据库选项之一。想象一下,如果你试图说服你们的团队,你们的项目应该从头开始编写自己的数据库,其他人会有多么大的反对声。

如果有人说团队应该从头开始研发一种持久性存储技术,大家肯定会觉得这样的场面看起来很愚蠢;但选择你的 Web 应用程序 API 样式(传输 / 客户端 - 服务器技术)其实也是一样的道理。

去年(2019 年),我意识到 API 在技术栈中的深度已经超出了我们的想象。API 的触角伸到了前端框架的数据存储,也伸到了后端服务的合约层面。

这听起来可能有点虚幻,但它的确就是那样。在 Apollo GraphQL,我们将这种虚拟层称为数据图。并且 Apollo 构建了很多可提高开发人员生产效率的工具。

3数据图

数据图这个理念我是最早在 2019 年 GraphQL 峰会上听 Apollo GraphQL 的首席技术官 Matt DeBergalis 提出的。我强烈推荐 Matt 在 2019 年 GraphQL 峰会上的演讲,他介绍了数据图的概念。

https://youtu.be/EDqw-sGVq3k

数据图是虚拟层,位于我们的客户端应用程序和 GraphQL 服务器之间。它保存了整个组织的数据,并提供了用来在整个组织内获取和更改状态的语言

数据图是一个声明性的、自文档化的、组织层面的 GraphQL API。

对我来说,数据图是现代应用程序技术栈中之前缺少的一个层

基本的全栈 Apollo Client+Server 应用程序栈

4数据图让远程状态更接近客户端本地状态

所有前端框架都需要解决的三个挑战分别是数据存储、更改检测和数据流。

React 开发人员通常需要修补 Redux 或 Context,并编写大量样板代码来满足这些要求。

Apollo 发布了带有 apollo-link-state 的 Apollo Client 后,React 开发人员就能用更少的代码满足所有这三个需求了。

Apollo-link-state(现已直接放入 Apollo Client 2 和 3 中)让开发人员可以编写几乎同时解决远程状态和本地状态的查询。远程状态(位于服务器上)感觉比之前近多了。

比如说用这种查询来按照狗的品种(breed)来获取一只狗:

查询 /dog.js

const GET_DOG = gql`query GetDogByBreed($breed: String!) {dog(breed: $breed) {images {urlidisLiked @client # signal to resolve locally}}}`;

在主要用于获取远程资源的查询中,我们可以使用 @client 指令来引用要基于一个客户端模式从本地缓存中获取的属性。我们可以在同一请求中完成这一操作,这很厉害。想想之前在 Redux 环境我们要执行的 spread 和 Object.assign() 操作的数量有多少,就可以对比出差异了。

简化的数据获取架构,其中视图可以是任意前端框架——nerdwallet

数据图在连接的两端均有 Apollo 服务器和客户端,它可以简化获取逻辑、错误逻辑、重试逻辑、分页、缓存、optimistic UI 以及其他各种类型的样板数据管道代码。

数据图从客户端延伸到服务器,并为现代 Web 应用程序中获取数据和更改状态时面临的最常见基础架构问题提供了答案

为了通过 GraphQL 与后端服务通信,Apollo Client 公开了几种客户端方法,这些方法在被调用时会将操作转换为适当的 API 以跨越数据图。

在 Apollo Server 端,这些 API 调用将控制权转交给负责使用 ORM、原始 SQL、缓存、其他 RESTfulAPI 或任何你想到的方法来获取数据的解析器。对于突变,解析器可以简单地将控制权传递给一个应用层用例。

将用例作为应用程序的重心后,从 REST 切换到 GraphQL(或同时支持两者)变得轻而易举。

5GraphQL 是自文档化的

维护 RESTfulAPI 时需要做的一件麻烦事是保持文档及时更新和内容全面。

RESTfulAPI 有两处可以更改。

路由 + 方法组合

请求形式 + 参数

路由 + 方法组合的一个例子是,某人可以很简单地将创建一个用户的操作从 POST /users 移至 POST /users/new。这样的 API 更改可能不会引起注意,却会破坏 API 的所有客户端,并且 API 客户端几乎不可能检测到该组合的更改。

请求形式 + 参数的一个例子是,一个对 /users/new 的 POST 请求过去只需要一个 email 和一个 password,但现在它还需要一个 username 属性。API 客户端了解如何解决该请求的唯一方法是检查错误响应(指望错误消息描述了所需的信息,否则也没用)。

如果你认为自省(introspection)是全面的文档,那么可以说GraphQL 是自文档化的,并且你的 API 文档无法失去同步。

使用 GraphQL Playground,可以浏览 GraphQL 端点的所有功能。

由于具备执行自省查询的能力,所以 GraphQL Playground 的 GraphQL 资源管理器可以显示 GraphQL 端点的所有功能

在 REST 领域中,我只看到了使用 Swagger 构建的 API 具有这么大的元数据量。这是一项非常强大的特性,它不仅让代码成为了文档的唯一真实来源,而且为我们提供了通过代码生成来自动创建 TypeScript 类型、客户端库或服务到服务通信的基础。

由于 GraphQL 语言是通行(ubiquitous)且标准化的,因此人类和机器会更容易理解如何集成和使用它。

6关注点的扩展和分离

GraphQL 原则指出,

“你的公司应该有一个统一的图,而不是让各个团队创建很多图。”

随着越来越多的团队开始使用 GraphQL,公司内部会出现多个图的情况。

使用 Apollo Federation,每个服务团队都可以从其限界上下文中构建和管理自己的 GraphQL 服务,将其注册到一个 Apollo 网关,从而在整个企业中分布化 GraphQL 的运维工作。

通过 Apollo Federation,我们可以绘制并公开由多个 GraphQL 端点组成的单个数据图

在 Federation 中,你可以组成模式并解析其他服务 / 限界上下文中的字段。收到请求时,将从相应的服务中解析这些字段。

对于规模庞大的组织来说,这种需求并不罕见。

7单一端点

SOLID 原则中的开闭原则指出:

“组件 / 系统 / 类应对扩展开放,但对修改封闭”。

在架构层面,由于 GraphQL 仅向客户端公开单个端点,因此它满足了这一原则。

客户端隐藏了字段解析机制的所有复杂性,它只需关注如何在 GraphQL 服务器之上构建即可。

该图描述了组织的数据图随时间的演变

8扩张前端开发人员的权力

数据图减少了前端开发人员对后端开发人员的依赖,这样前者就可以自行为新的用例开发新的端点。

很多时候,我们对 UI 所做的微小改动也会让我们替换掉组件,或意识到我们错误地判断了数据需求,并且需要为一些组件添加更多字段。因为这种情况经常发生,并且因为 REST 如此严格,所以每当我们需要调整的时候都必须依赖后端团队来更改 REST API。

根据团队的结构,以下每个问题都可能意味着开发人员的生产力下降,并需要依赖后端团队。

团队是碎片化的吗?前端开发人员是只做前端开发,还是允许他们完成技术栈另一端的工作?

你的后端开发人员是否在远程工作?

你的后端开发人员在办公室工作吗?

9GraphQL 消除了管理 API 版本的需求

GraphQL 原则在版本控制方面也有很强的见解。它指出:

“模式应根据实际需求逐步构建,并随着时间的推移平稳发展。”

这意味着团队应该通过迭代来做更改,而不是在大版本中一次塞入很多更改,这样就可以实践敏捷模式开发了。

听上去一切都很完美,但是你我都生活在现实世界中。我知道这样理想化的情况并不总是存在,至少没有适当的工具链是不可能做到的

Apollo 平台有一项称为模式验证的特性,可让你针对实时生产流量测试每个更改,并在建议实施重大更改时向你显示提示,让团队可以交流接下来的方案。

这种感觉很顺滑!

10总结

在现代 Web 应用程序架构中,GraphQL 和 RESTfulWeb 服务器都是基础架构组件。

基础架构组件是基本组件,它们构成了我们编写的特定领域 Web 应用程序的基础。

基础架构组件并不是大多数 Web 开发项目的重心,因此我们应该将大部分时间用于应用程序和域层代码。

数据图是一个声明性的、自文档化的、组织层面的 GraphQL API,它使远程状态更接近客户端,可以使用 Apollo Federation 来扩展。

前端开发人员可以使用数据图来创建自己的数据获取用例,而不必依赖后端开发人员。

GraphQL 消除了管理 API 版本的需要,Apollo 的 GraphManager 可以简化生产模式验证。

原文链接

https://khalilstemmler.com/articles/graphql/graphql-architectural-advantages/

(0)

相关推荐

  • 实施IIoT的最大挑战——工业物联网软件平台与边缘智能

    摘要 新兴的技术和体系架构,可以帮助制造企业在集成生态系统中开发灵活的工业物联网(IIoT)基础架构. 随着工业物联网 (IIoT)的发展,它在集成方面也遇到了与以前不同代系的工业自动化相似的挑战.除 ...

  • 【Web安全】之【1.0 序章】

    【Web安全】之【1.0 序章】

  • API怎么选?比较SOAP,REST,GraphQL和RPC

    两个独立的应用程序需要中介程序才能相互通信. 因此,开发人员经常建立桥梁-应用程序编程接口-来允许一个系统访问另一个系统的信息或功能. 为了快速,大规模地集成应用程序,使用协议和/或规范来定义通过导线 ...

  • 为什么我使用 GraphQL 而放弃 REST API?

    在大多数移动和 Web 应用中,服务器交互需要花费开发人员大量时间和精力来开发和测试. 在我所开发的那些拥有最复杂 API 应用程序中,网络层设计和维护占去高达 40% 的开发时间,特别是由于我在本文 ...

  • 备份Kubernetes的5个最佳实践

    备份应用程序和数据是组织经常需要处理的事情.尽管Kubernetes可以确保应用程序服务的高可用性和可伸缩性,但这些好处并不能有效地保护数据.因此,必须对Kubernetes应用程序进行数据管理和备份 ...

  • 什么是DDS?

    工业物联网成熟的数据连接标准 数据分发服务(DDS™)是一个由对象管理组(OMG)发布的以数据为中心的中间件协议和API标准.DDS集成系统中的各个组件,提供低延迟数据连接.高可靠性以及高可扩展体系结 ...

  • 微服务分解策略

    微服务架构的关键思想是功能分解.这意味着您无需开发单个大型应用程序,就可以将您的应用程序结构分解为一组逻辑服务. 应用程序的体系结构很重要,因为它决定了服务的质量 传统目标:可伸缩性,可靠性和安全性. ...

  • AMD Zen 2架构优势在哪里?更大的缓存,更高的带宽,更灵活的扩展性

    AMD对于第三代锐龙桌面处理器的信心可以说是非常充足的,因为它们不仅有目前游戏PC领域中规格最高的16核32线程处理器锐龙9 3950X,而且在性能上基本已经超越了对手同级别的产品.那么为什么新的锐龙 ...

  • 什么是MES制造执行系统?MES的优势,架构和核心功能

    市场需求迫使制造商每天提高生产效率,而MES制造执行系统则为实际的输出执行提供了一个智能的结构.减少废品,增加正常运行时间和降低成本等因素是MES软件市场到2025年将达到243.44亿美元的最主要原 ...

  • 朱晔的互联网架构实践心得S2E5:浅谈四种API设计风格(RPC、REST、GraphQL、服务端驱...

    Web API设计其实是一个挺重要的设计话题,许多公司都会有公司层面的Web API设计规范,几乎所有的项目在详细设计阶段都会进行API设计,项目开发后都会有一份API文档供测试和联调.本文尝试根据自 ...

  • 典型交换机链路聚合使用场景和配置,堆叠、集群概述、优势、架构

    典型使用场景 (1) 交换机之间 为保证交换机之间的链路带宽以及可靠性,可以在交换机之间部署多条物理链路并使用Eth-Trunk. 交换机与服务器之间 为了提高服务器的接入带宽和可靠性,将两个或者更多 ...

  • 化鲲为鹏,我有话说 ,鲲鹏ARM架构的优势

    首先我在想为什么会用到鲲鹏,我个人认为最重要的还是要掌握自主研发的能力,打破国外关键技术的封锁.鲲鹏芯片完全是华为于自主设计内核,华为云Kunpeng服务器关键计算芯片全自研,提供产品可持续供应能力. ...

  • thingsboard微服务架构的优势特点及应用实践

    在众多的开源物联网平台项目中,Thingsboard在体系架构先进性.功能完整性.文档完备性方面,应是首屈一指.但其自身存在的一些短板,直接影响到市场应用的普及.我们艾瑞博达团队,跟进ThingsBo ...

  • OpenFog联盟:雾计算如何助力工业物联网——雾架构的五个优势及八大支柱模型

    摘要 在数据驱动的生产制造环境中,如何开发一个安全的.分布式自动化架构?在雾计算与云计算之间的平衡控制,将有助于工业物联网更好的发挥其潜能. 通过工业物联网(IIoT )来实现自动化系统,部署传感器来 ...

  • 平行基金模式的架构及优势分析

    中国PE行业发展之初,外资PE处于一枝独秀的地位,曾经繁荣了中国资本市场.随着中国资本市场的崛起,民营产业基金的加入,使中国PE行业形成了三足鼎立的新格局. 初入中国的外资PE曾经因外资政策的限制而在 ...

  • 高能效优势回来了,AMD“Polaris”北极星GPU架构解析

    作为显卡市场上仅存的唯二选择,大家对AMD.NVIDIA显卡多少都有一些固有印象--比如NVIDIA显卡性能强,但功耗高,AMD显卡坚持小核心,性能略差,但性价比高,功耗低,这种印象在双方的GTX 4 ...