什么是 GraphQL?
GraphQL 是一种查询语言和执行引擎,可用于构建客户端应用程序。它由 Facebook 开发,旨在为客户端提供用于获取数据的标准化 API。GraphQL 通过提供一个聚合层,将服务器上不同的数据源绑定在一起,并使客户端能够请求与其需求完全匹配的数据。
比起 REST API,GraphQL 有四个主要的优势:
- 客户端能够请求特定字段,这意味着无需获取整个数据对象。
- 每个 GraphQL 请求返回的数据结构都是统一的,这样客户端就可以直接使用了,不需要再从服务端自己转换了。
- GraphQL 让客户端可以在一个请求中获取多个资源。
- 通过定义 GraphQL 的模式,可以让客户端和服务端共享约定,包括接口定义和类型检查。
GraphQL 中的微服务
当我们构建 GraphQL API 时,通常需要从多个源获取数据,例如 MySQL 数据库,Redis 缓存,Rest API 甚至其他 GraphQL 服务。在传统的 monolithic 架构中,将多个数据源储存在同一个数据库中,但在微服务架构中,每个服务都有一个独立的数据源。
在 GraphQL 中,使用微服务可以为我们带来以下好处:
- 每个服务都能专注于自己的数据源,并简化其数据图形以提高性能。
- 由于微服务都有自己的 API,因此可以使用 GraphQL 模式定义,将服务整合到一个 GraphQL 服务中。
- 使用微服务可以消除由于调用 API 而引起的复杂度,并在实现查询后使用结果缓存来加快响应速度。
使用示例代码
如果你想尝试使用 GraphQL 和微服务构建应用程序,那么可以先从基本的示例代码开始。下面的代码演示了在 Node.js 中使用 Apollo Server 和微服务的基本用法。
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- - -------------- - - ---------------------------------- ----- ----- - ---------------------- ----- --------- - ---------------------------- ----- ----- - - - --- -- ----- ------- -------- --- -- - --- -- ----- ------- -------- --- -- -- - --- -- ----- ------ -------- --- -- -- -- ----- ------- ------- -------------- - ------------- - -------- ------------ - --------------------------------------------- - ----- ------------- - ----- ----- - ----- ------------- ----- -------- - ----------------- -- ---------------------- ------ ----------------- -- -- -------- -------- -------------- -- ---- --- -------------- -- ------ ---- - - ----- -------- - ---- ---- ---- - --- --- ----- ------ -------- ----- - ---- ----- - -------- ----- ---- ---------- ------- ------ - -- ----- --------- - - ------ - ----- ----- -------- - -- -- - ----------- -- -- - ------ ------------------------------------- -- ----- -- ------ ----- -------- - --- -- - ----------- -- -- ---------------------------------- -- ----- - -------- -- ------- -- -- -------- -- -- ----- ------ - --- -------------- --------- ---------- ------------ -- -- -- -------- --- ---------- --- --- ----------------------- --- -- -- - --------------- ------ ----- -- --------- ---
这段代码中,我们定义了一个 User 类型和一个 Query 类型。User 类型包括 id、name、userIds 字段。Query 类型包括 user 和 users 函数,用以获取单个用户和多个用户的信息。
我们使用 apollo-datasource-rest
和 node-fetch
来访问第三方 REST API。(由于 JSONPlaceholder 中不存在与 'id' 字段对应的用户,因此这并不是一个很好的示例。)
我们将 UserAPI 类继承了 RESTDataSource,这可以为我们处理请求、传递 headers 等,并使我们能够轻松地维护实例的状态。在 getUsers 函数中,我们使用 this.get 调用了 JSONPlaceholder 的 users 接口,并过滤出 ID 包含于查询参数 ids 中的用户。
在 resolvers 函数中,我们根据数据源将用户数据绑定到用户查询中,而在 dataSources 中我们创建了 UserAPI 实例并传入 Apollo Server。
结论
GraphQL 是一个强大的工具,可以将多个数据源组合成一个易于使用的 API。使用微服务可以使查询更快、更可靠、更易于维护,并消除由于调用 API 而造成的复杂性。如果你正在使用 Node.js 和 GraphQL 构建应用程序,那么使用微服务来提高性能和可靠性将是一种不错的选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67505938fbd23cf89076dbe0