API 开发,gRPC 还是 GraphQL?

本文将比较 gRPC 和 GraphQL,帮助您选择更适合您的 API 开发方案。

用 Apifox,节省研发团队的每一分钟

API 开发,gRPC 还是 GraphQL?

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

什么是 GraphQL?

GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。它跟 SQL 的关系是共用 QL 后缀,就好像「汉语」和「英语」共用后缀一样,但他们本质上是不同的语言。GraphQL 跟用作存储的 NoSQL 没有必然联系,虽然 GraphQL 背后的实际存储可以选择 NoSQL 类型的数据库,但也可以用 SQL 类型的数据库,或者任意其它存储方式(例如文本文件、存内存里等)。

GraphQL 接口是怎么传输的?

GraphQL 接口是怎么传输的?
  1. 客户端构造 GraphQL 查询语句,表示需要提取的数据结构,例如查询某个用户的名字和年龄。
  2. 客户端以 JSON 格式封装查询语句,放在 HTTP POST 请求的 body 内,发送到服务器的 GraphQL endpoint。
  3. 服务器接收请求,验证查询语句语法无误,分析客户端需要的数据。
  4. 服务器从数据源获取对应数据,过滤出请求的字段,存为 JSON 对象。
  5. 服务器将包含响应数据的 JSON 通过 HTTP 返回给客户端。
  6. 客户端获取响应,解析 JSON,提取到需要的 user 信息。

什么是 gRPC?

gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用( Remote Procedure Calls)框架,可在多个开发环境下运行。它采用了领先的 HTTP/2 底层架构设计作为底层传输协议所以 gRPC 自然也包含了HTTP2 的优点:

  • 数据传输二进制分帧
  • 多路复用
  • 服务端推送
  • 头部压缩

gRPC 接口是怎么传输的?

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 项目。

使用 Apifox 发送 GraphQL
创建 HTTP 项目

在接口地址中输入 GraphQL 的服务地址,然后发起请求。

使用 Apifox 发送 GraphQL
发起请求

使用 Apifox 发送 gRPC 请求

如果你不习惯 Postman 的英文界面,你还可以尝试另一个更加简单便捷的接口测试工具——Apifox。Apifox 支持基于 .proto 文件的 gRPC 调试,包括一元调用和流式调用。

在创建项目时「选择 gRPC 项目」-->「导入 .proto 文件」,无需写代码即可直接调用 gRPC 接口。

使用 Apifox 发送 gRPC 请求
创建 gRPC

在调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。如果一个 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。

使用 Apifox 发送 gRPC 请求
添加 Proto

一元调用

只需要在地址栏填写 URL 后点击「调用」按钮,即可发起一元调用。

使用 Apifox 发送 gRPC 请求
一元调用

流式调用

流式调用包含服务端流、客户端流、双向流

在发起调用之后,你可以在 Message 标签下撰写消息并发送,通过时间线视图集中展示调用状态、发送的消息、收到的消息。

使用 Apifox 发送 gRPC 请求
流式调用

关于 Apifox

  • 集成了 API 文档、API 调试、API Mock、API 自动化测试 API 一体化协作平台
  • 拥有更先进的 API 设计/开发/测试工具
  • Apifox = Postman + Swagger + Mock + JMeter
Apifox

知识扩展: