引言
在微服务架构中,服务之间的通信是非常常见的,一个服务可能会调用到多个其他的服务。但由于每个服务拥有自己独立的数据存储,在进行跨服务调用时就会存在一定的麻烦。传统的解决方案是使用 RESTful API 进行通信,但这种方式存在着一些问题,例如需要进行多次请求才能获得所有需要的数据,需要事先定义好 API 的格式等。为了解决这些问题,可以使用 GraphQL 作为服务之间的通信协议。
本文将会介绍如何使用 GraphQL 解决 Microservices 中的跨服务查询问题。我们将会从 GraphQL 的基本概念、原理以及实践中的使用进行讲述。
GraphQL 基础
GraphQL 是一种由 Facebook 创建的数据查询和操作语言,用于 API 的设计和实现。相比于传统的 RESTful API,GraphQL 更加灵活,可以让客户端精确地获取需要的数据。
原理
GraphQL 的核心原理是声明式数据查询。客户端可以通过 GraphQL 查询请求来获取数据,该请求描述了需要的数据和其相关指令。这个查询请求会被发送到服务端,服务端会解析查询请求,并返回客户端所需要的准确的数据。
GraphQL 的查询语言基于类型系统,由一个查询文本和一个根查询类型组成。查询文本中包含了客户端所需的数据和指令。GraphQL 的服务端会根据类型系统,在数据模型上进行查询操作,并生成一个 JSON 格式的响应结果返回给客户端。
GraphQL 中的类型系统由类型、字段、参数等组成。通过定义类型系统,开发者可以精细控制数据的查询。另外,GraphQL 还支持数据修改操作,包括增加、更新、删除等。
查询语言
GraphQL 的查询语言相比于 RESTful API 更加强大,一个完整的查询语句包含以下部分:
query { propertyName propertyName { subPropertyName } }
其中,query
是查询操作的类型,propertyName
是需要查询的属性名,subPropertyName
是属性名下面的子属性。如果需要带参数的查询,可以写成如下格式:
query ($id: Int!) { book(id: $id) { title author } }
其中的 $id
是一个参数,Int!
表示该参数是一个必选项,并且类型为整数类型。 上面的查询语句表示查询一本书的标题和作者,需要传入一个整数类型的 id
参数。
GraphQL 与 RESTful API 的区别
GraphQL 相对于传统的 RESTful API 具有很多优点:
- 更节省网络请求:传统 RESTful API 中,要获取多个子数据,一般需要进行多次请求,而 GraphQL 可以在一个请求中获取所有需要的数据。
- 客户端控制数据:客户端可以根据需求自己定义查询请求来获取需要的数据,而不是服务器端提供一种固定的数据格式。
- 丰富的查询语言:GraphQL 的查询语言更加强大灵活,支持以类型系统的形式来定义查询和数据。可以通过定义一个查询类型,进行复杂查询。
- 对于多查询限制更少:GraphQL 可以避免服务端返回不需要的数据,减少了无效查询导致的资源浪费。
GraphQL 在 Microservices 中的使用
使用 GraphQL 作为跨服务通信协议,可以有效解决 Microservices 中的跨服务查询问题。下面我们将会演示一下如何在 Node.js 中使用 GraphQL 做一个简单的实现。
示例
我们以图书管理系统为例,其中包含有 Book
和 Author
两个服务,它们分别保存了图书信息和作者信息。现在我们需要通过一个 API 获取一本书的所有信息,包括书本的标题和作者的信息。使用 GraphQL 我们可以通过以下的方式进行实现:
- 首先定义一个 GraphQL 的查询文件
query.graphql
,该文件中包含了需要的查询信息:
-- -------------------- ---- ------- ----- --------- ---- - -------- -------- - -- ----- ------ - -- ---- --- - - -
其中 book
对应了查询对象的类型,title
和 author
分别是一个书籍对象的属性。$bookId
是查询中需要使用的参数。
- 使用 Apollo 客户端,从服务端通过 HTTP 请求获取数据。
-- -------------------- ---- ------- ------ - ------------- ---- ------------- - ---- ----------------- ----- ------ - --- -------------- ---- -------------------------------- ------ --- ---------------- --- ------ -------- ------ ---- ----- --------- ---- - -------- -------- - -- ----- ------ - -- ---- --- - - - -- ---------- - ------- -------- -- -- -------------- -- ---------------------
- 服务端会解析查询请求,并返回客户端所需的数据。在服务端我们需要使用 GraphQLServer 提供一个 GraphQL 服务:
-- -------------------- ---- ------- ------ --------------- ---- --------------- ------ - -- ---- ---- ------- ------ ---------------- ---- ----------------- ------ ------ ---- ------------------ ------ -------- ---- -------------------- ------ ----------- ---- -------------- ----- ----- - ---------- ------- ---------- ----- -------- ----------- -- - ----- -------- - ----- --------------------------- ---- -- ----------------------------------- ---------------------------- --- ----- ------ - --- --------------- --------- ------------- ----------- -------- ------------- --- ------- -------------- --- ---------- --- ----- ------- - - ----- ----- --------- ----------- ----------- -------------- -- --------------------- -------- -- ------------------- -- ------- -- --------------------- - --------------
./services/book.ts
和 ./services/author.ts
是数据的提供者,从数据库或者其他存储中获取数据,并通过 GraphQL 接口方法暴露出去。
总结
GraphQL 作为一种现代的API设计风格,越来越被开发者们所接受和推崇。通过本篇文章的介绍,我们可以了解到 GraphQL 的基础知识,以及它在解决 Microservices 间跨服务查询问题时的应用。要学习更多关于 GraphQL 的使用,推荐阅读官方文档。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647c23ba968c7c53b074e3a5