什么是 GraphQL?
GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。它跟 SQL 的关系是共用 QL 后缀,就好像「汉语」和「英语」共用后缀一样,但他们本质上是不同的语言。GraphQL 跟用作存储的 NoSQL 没有必然联系,虽然 GraphQL 背后的实际存储可以选择 NoSQL 类型的数据库,但也可以用 SQL 类型的数据库,或者任意其它存储方式(例如文本文件、存内存里等)。
GraphQL 接口是怎么传输的?
- 客户端构造 GraphQL 查询语句,表示需要提取的数据结构,例如查询某个用户的名字和年龄。
- 客户端以 JSON 格式封装查询语句,放在 HTTP POST 请求的 body 内,发送到服务器的 GraphQL endpoint。
- 服务器接收请求,验证查询语句语法无误,分析客户端需要的数据。
- 服务器从数据源获取对应数据,过滤出请求的字段,存为 JSON 对象。
- 服务器将包含响应数据的 JSON 通过 HTTP 返回给客户端。
- 客户端获取响应,解析 JSON,提取到需要的 user 信息。
什么是 gRPC?
gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用( Remote Procedure Calls)框架,可在多个开发环境下运行。它采用了领先的 HTTP/2 底层架构设计作为底层传输协议,所以 gRPC 自然也包含了HTTP2 的优点:
- 数据传输二进制分帧
- 多路复用
- 服务端推送
- 头部压缩
gRPC 接口是怎么传输的?
从上图的 gRPC 传输模型可以看出,客户端 Stub 从 gRPC Core 库发起请求,序列化成 Protobuf 消息格式,然后传输至服务端。
服务端 Stub 接收客户端请求,处理请求中的 Protobuf 数据并进行反序列化,然后将请求对象传入服务器并实现业务逻辑处理。最终再将响应序列化后返回给客户端,从而形成一次完整的接口调用过程。
gRPC VS GraphQL
界面设计
gRPC 和 GraphQL,它们两个都是属于一类语言,他们都描述了计算机之间怎么进行通信,其实就是界面描述语言(IDL),。它们适用于不同的编程语言,我们可以使用一些 工具来生成各种各样语言的类型接口。GraphQL是与传输无关的,通常基于HTTP工作,而gRPC则基于HTTP2工作。
信息格式
- gRPC 使用传输的格式是二进制,传输只包含数值,
- GraphQL 传输的是 JSON 格式,它传输是基于文本的,它除了传输数值之外还包括其他字段名。
- gRPC 消息比 GraphQL 消息小,因为二进制格式与较少的信息发送相结合。
- gRPC 使用二进制格式还有另外一个好处,比 GraphQL 信息的序列化和解析更快。但是,也有很明显的缺点,它相对于 JSON,更难调试和查看,因为 JSON 的信息结构更加清晰。
默认值
- gRPC 的消息中不包括默认值,所以 gRPC 消息尺寸较小
- GraphQL 可以设置参数的默认值,却不能设置请求字段的默认值
请求格式
在 gRPC 中,我们一次只会调用一个方法。如果我们需要的数据比一个方法所返回的要多,就需要调用多个方法。如果我们需要第一个方法的响应数据,以便知道下一步调用哪个方法,那么我们就会连续进行多次往返。除非我们和服务器在同一个数据中心,否则会造成很大的延迟。这个问题被称为 underfetching,指请求的返回的数据信息不够,这样导致我们需要发多个请求去获取数据。
向前兼容
gRPC 和 GraphQL 的向前兼容性,都很良好。
好处就是,可以用以前方式现有客户端的方式更新去个更新服务器。
传输
- gRPC 支持支持服务器向客户端传输数据(serverstreaming)
- GraphQL 支持服务器向客户端传输数据(Subscriptions)
使用 Apifox 发送 GraphQL
在 Apifox 创建 HTTP 项目。
在接口地址中输入 GraphQL 的服务地址,然后发起请求。
使用 Apifox 发送 gRPC 请求
如果你不习惯 Postman 的英文界面,你还可以尝试另一个更加简单便捷的接口测试工具——Apifox。Apifox 支持基于 .proto 文件的 gRPC 调试,包括一元调用和流式调用。
在创建项目时「选择 gRPC 项目」-->「导入 .proto 文件」,无需写代码即可直接调用 gRPC 接口。
在调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。如果一个 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。
一元调用
只需要在地址栏填写 URL 后点击「调用」按钮,即可发起一元调用。
流式调用
流式调用包含服务端流、客户端流、双向流。
在发起调用之后,你可以在 Message 标签下撰写消息并发送,通过时间线视图集中展示调用状态、发送的消息、收到的消息。
关于 Apifox
- 集成了 API 文档、API 调试、API Mock、API 自动化测试 API 一体化协作平台
- 拥有更先进的 API 设计/开发/测试工具
- Apifox = Postman + Swagger + Mock + JMeter
知识扩展: