没有合适的资源?快使用搜索试试~ 我知道了~
简单对象访问协议(SOAP)从今天来看已经是一门非常古老的Web服务技术了,虽然很多服务仍然在使用遵循SOAP的接口,但是到今天REST风格的面向资源的API接口已经非常深入人心,也非常的成熟;但是这篇文章要介绍的主角其实是另一门更加复杂、完备的查询语言GraphQL。作为Facebook在2015年推出的查询语言,GraphQL能够对API中的数据提供一套易于理解的完整描述,使得客户端能够更加准确的获得它需要的数据,目前包括Facebook、Twitter、GitHub在内的很多公司都已经在生产环境使用GraphQL提供API;其实无论我们是否决定生产环境中使用GraphQL,它确实是一门值
资源推荐
资源详情
资源评论
GraphQL在微服务架构中的实践在微服务架构中的实践
GraphQL
简单对象访问协议(SOAP)从今天来看已经是一门非常古老的 Web 服务技术了,虽然很多服务仍然在使用遵循 SOAP 的接
口,但是到今天 REST 风格的面向资源的 API 接口已经非常深入人心,也非常的成熟;但是这篇文章要介绍的主角其实是另
一门更加复杂、完备的查询语言 GraphQL。
作为 Facebook 在 2015 年推出的查询语言,GraphQL 能够对 API 中的数据提供一套易于理解的完整描述,使得客户端能够
更加准确的获得它需要的数据,目前包括 Facebook、Twitter、GitHub 在内的很多公司都已经在生产环境使用 GraphQL 提供
API;其实无论我们是否决定生产环境中使用 GraphQL,它确实是一门值得学习的技术。
类型系统
GraphQL 的强大表达能力主要还是来自于它完备的类型系统,与 REST 不同,它将整个 Web 服务中的全部资源看成一个有
连接的图,而不是一个个资源孤岛,在访问任何资源时都可以通过资源之间的连接访问其它的资源。
如上图所示,当我们访问 User 资源时,就可以通过 GraphQL 中的连接访问当前 User 的 Repo 和 Issue 等资源,我们不再需
要通过多个 REST 的接口分别获取这些资源,只需要通过如下所示的查询就能一次性拿到全部的结果:
{
user {
id
email
username
repos(first: 10) {
id
url
name
issues(first: 20) {
id
author
title
}
}
}
}
GraphQL 这种方式能够将原有 RESTful 风格时的多次请求聚合成一次请求,不仅能够减少多次请求带来的延迟,还能够降低
服务器压力,加快前端的渲染速度。它的类型系统也非常丰富,除了标量、枚举、列表和对象等类型之外,还支持接口和联合
类型等高级特性。
为了能够更好的表示非空和空字段,GraphQL 也引入了 Non-Null 等标识代表非空的类型,例如 String! 表示非空的字符串。
schema {
query: Query
mutation: Mutation
}
Schema 中绝大多数的类型都是普通的对象类型,但是每一个 Schema 中都有两个特殊类型:query 和 mutation,它们是
GraphQL 中所有查询的入口,在使用时所有查询接口都是 query 的子字段,所有改变服务器资源的请求都应该属于 mutation
类型。
集中式 vs 分散式
GraphQL 以图的形式将整个 Web 服务中的资源展示出来,其实我们可以理解为它将整个 Web 服务以 “SQL” 的方式展示给前
端和客户端,服务端的资源最终都被聚合到一张完整的图上,这样客户端可以按照其需求自行调用,类似添加字段的需求其实
就不再需要后端多次修改了。
与 RESTful 不同,每一个的 GraphQL 服务其实对外只提供了一个用于调用内部接口的端点,所有的请求都访问这个暴露出来
的唯一端点。
GraphQL 实际上将多个 HTTP 请求聚合成了一个请求,它只是将多个 RESTful 请求的资源变成了一个从根资源 Post 访问其
他资源的 Comment 和 Author 的图,多个请求变成了一个请求的不同字段,从原有的分散式请求变成了集中式的请求,这种
方式非常适合单体服务直接对外提供 GraphQL 服务,能够在数据源和展示层建立一个非常清晰的分离,同时也能够通过一些
强大的工具,例如 GraphiQL 直接提供可视化的文档;但是在业务复杂性指数提升的今天,微服务架构成为了解决某些问题时
必不可少的解决方案,所以如何在微服务架构中使用 GraphQL 提高前后端之间的沟通效率并降低开发成本成为了一个值得考
虑的问题。
Relay 标准
如果说 RESTful 其实是客户端与服务端在 HTTP 协议通信时定义的固定标准,那么 Relay 其实也是我们在使用 GraphQL 可
以遵循的一套规范。
这种标准的出现能够让不同的工程师开发出较为相似的通信接口,在一些场景下,例如标识对象和分页这种常见的需求,引入
设计良好的标准能够降低开发人员之间的沟通成本。
Relay 标准其实为三个与 API 有关的最常见的问题制定了一些规范:
提供能够重新获取对象的机制;
提供对如何对连接进行分页的描述;
标准化 mutation 请求,使它们变得更加可预测;
通过将上述的三个问题规范化,能够极大地增加前后端对于接口制定和对接时的工作效率。
对象标识符
Node 是 Relay 标准中定义的一个接口,所有遵循 Node 接口的类型都应该包含一个 id 字段:
interface Node {
id: ID!
}
type Faction : Node {
id: ID!
name: String
ships: ShipConnection
}
type Ship : Node {
id: ID!
name: String
}
Faction 和 Ship 两个类型都拥有唯一标识符 id 字段,我们可以通过该标识符重新从服务端取回对应的对象,Node 接口和字段
在默认情况下会假定整个服务中的所有资源的 id 都是不同的,但是很多时候我们都会将类型和 id 绑定到一起,组合后才能一
个类型特定的 ID;为了保证 id 的不透明性,返回的 id 往往都是 Base64 编码的字符串,GraphQL 服务器接收到对应 id 时进
行解码就可以得到相关的信息。
连接与分页
在一个常见的数据库中,一对多关系是非常常见的,一个 User 可以同时拥有多个 Post 以及多个 Comment ,这些资源的数量
在理论上不是有穷的,没有办法在同一个请求全部返回,所以要对这部分资源进行分页。
剩余15页未读,继续阅读
资源评论
weixin_38740130
- 粉丝: 6
- 资源: 926
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功