3

英文原版地址:https://www.howtographql.com/...

GraphQL仅仅作为规范发布。 这意味着GraphQL实际上,不会是一个详细描述GraphQL服务端行为的完整文档。

如果你想使用GraphQL,你必须自己去搭建GraphQL服务。你可以选择任何编程语言来实现(例如这些可参考的实现方式)或通过选用像Graphcool这样的服务,它提供了一个功能强大的GraphQL API。

用例

在本节中,我们将介绍使用GraphQL服务的3种不同类型的架构:

1.连接数据库的GraphQL服务

2.GraphQL服务作为轻量的一层,在第三方接口,或一些现有系统之上。通过一个GraphQL API集成起来。

3.混合以上两种方式,通过相同的GraphQL API,同时可以访问数据库和第三方接口或现有旧系统。

上述这三种架构,代表了GraphQL的主要用例,并展现出了使用时的灵活性。

1.连接数据库的GraphQL服务

这种架构是greenfield项目中最常见的。在设置中,您有一个(Web)服务器实现GraphQL规范。 当查询请求到GraphQL服务器时,服务器读取查询的payload并从数据库中读取所需的信息。 这被称为查询的解析。然后,它按照官方规范中的描述构造响应对象,并将其返回给客户端。

需要注意的是,GraphQL实际上是传输层无关的。这意味着它可以和任意的网络协议一起使用。 因此,GraphQL服务器可能是基于TCP,Websockets或者其他网络协议的。

GraphQL也不关心是什么数据库以及用于存储数据的格式。你可以使用像AWS Aurora这样的SQL数据库或者像MongoDB这样的NoSQL数据库。

图片描述

一个标准的连接到单个数据库的,GraphQL服务器的greenfield架构。

2.集成现有系统的GraphQL层

GraphQL的另一个主要用例是将多个现有系统集成在一个统一的GraphQL API后面。这对有着遗留基础设施和许多不同API的公司尤其引人注目,这些API已经维护了多年,现在却造成了很重的维护负担。这些传统系统的一个主要问题是,人们很难做出需要访问多个旧系统的创新产品。

在这种情况下,GraphQL可以用于统一这些系统,并将这些复杂的事情隐藏在一个友好的GraphQL API之后。这样,就可以去开发新的客户端应用,只需与GraphQL服务器通信即可获取所需的数据。然后,GraphQL服务器负责从现有系统中提取数据,并以GraphQL格式进行响应。

就像在以前的架构中,GraphQL服务器不关心正在使用的数据库的类型,这一次它不关心用来获取查询结果所需的数据源。

图片描述

GraphQL允许你隐藏现有系统的复杂性,在统一的GraphQL接口后面,集成微服务,传统基础架构和第三方API。

3.连接数据库与现有系统集成的混合方式

最后,可以组合这两种方法,构建一个连接数据库,同时又与旧有或第三方系统集成的GraphQL服务器。

当服务器接收到查询时,将解析它,并从连接的数据库或某些集成的API中检索出所需的数据。

图片描述

这两种方法也可以组合起来,GraphQL服务器可以从单个数据库或者现有系统获取数据,从而达到灵活性,并将所有数据管理的复杂性交给到服务器。

Resolver方法

但是,如何通过GraphQL获得这种灵活性?它是如何适配好这些差别明显的不同类型的用例?

如上一章所了解,GraphQL查询(或mutation)的payload由一组字段组成。在GraphQL服务器实现中,这些字段中的每一个实际上都对应于一个称为resolver的函数。resolver的作用就是获取对应字段的数据。

当服务端收到查询时,会调用查询中payload里字段对应的函数,检索出每个字段的数据。当所有resolver都返回了结果,服务端将按照查询里描述的数据格式打包好数据,将结果返回给客户端。

图片描述

查询中的每个字段对应一个resolver函数。当需要查询指定数据时,GraphQL将调用所有需要的resolver方法

GraphQL客户端库

GraphQL对于前端开发人员来说特别好,因为它完全消除了REST API的许多不便和缺点,例如过度和欠缺的数据加载。复杂性被推到服务端,强大的服务器可以处理繁重的计算工作。客户端不必知道获取的数据实际来自哪里,只需要使用单一,一致且灵活的API就可以。

让我们考虑使用GraphQL引入的重大变化,从一个相当迫切的数据获取方法转变为一个纯粹的声明式方法。从REST API获取数据时,大多数应用必须执行以下步骤:

1.构造和发送HTTP请求(例如,在Javascript中fetch
2.接收并解析服务器响应
3.在本地存储数据(简单地存在内存或持久存储)
4.在UI中显示数据

使用理想化的声明式数据获取方法,客户端不应该做以下两个步骤:

1.描述数据要求
2.在UI中显示数据

所有底层网络任务以及数据存储都应该被抽象出来,数据依赖关系的声明才应该是主要部分。

这恰恰是GraphQL的客户端库,如Relay或Apollo能做到的。它们提供了重要部分的抽象,让你不必去重复执行基础方法。从而让你能够专注于应用本身。

载入中...