什么是 RPC?
什么是 RPC 呢?
RPC 的全称是 Remote Procedure Call Protocol,中文名是远程过程调用协议。
其实你可以这么理解:
- RPC 是一种协议
- RPC 是一种 Client/Server 的传输模式
官方的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC 分为三层:
- 用户和服务器(负责处理业务逻辑,调用本地 Stub)
- Stub 处理客户端和服务端约定好的语法、语义的封装和解封装
- RPCRuntime 负责最底层的网络传输
我们看下面的图,是不是很像平时咱们开发中的场景:前端请求后端接口
RPC 解决了什么问题?
- 协议约定问题: 比如 0 代表是,1 代表否,你怎么让前后端共同遵守这个约定
- 传输协议问题: 在网络发生错误、重传、丢包或者有性能问题时怎么办
- 服务发现问题: 如何知道服务端有哪些服务可以调用,从哪个端口访问?服务端可能实现多个远程调用,在不同的进程上,随机监听端口,客户端要怎么才能知道这些端口呢?
RPC 的应用场景
一般用在这两个场景:
- 实时聊天
- 微服务系统
RPC 的传输过程是怎么样的?
- 调用者(客户端 Client)以本地调用的方式发起调用;
- Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体;
- Client stub将消息体通过网络发送给服务端;
- Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;
- Server stub 根据方法名和参数进行本地调用;
- 被调用者(Server)本地调用执行后将结果返回给 server stub;
- Server stub 将返回值打包编码成消息,并通过网络发送给客户端;
- Client stub 收到消息后,进行拆包解码,返回给 Client;
- Client 得到本次 RPC 调用的最终结果。
RPC 与 HTTP 的对比
其实 RPC 跟 HTTP 不是一个层级的东西,RPC 应该是跟 HTTP + RestFul 进行对比,才比较合适~
传输协议
RPC 可以基于 HTTP 或者 TCP 进行传输,而 HTTP 只能基于 HTTP
传输效率
RPC 包含了 HTTP2 的优点,所以他的传输效率比 HTTP1 更高~
性能消耗
RPC 包含 HTTP2 的优点,比如二进制传输、头部压缩等,所以性能消耗自然比 HTTP1 低~
负载均衡
RPC 基本都自带负载均衡策略,而 HTTP 需要配置 Nginx/HAProxy 来完成
服务治理
RPC 能做到自动通知,不影响上游,而 HTTP 需要事先通知,修改 Nginx/HAProxy 配置
什么是 gRPC
是什么
你可以理解为,gRPC 是基于 RPC 封装的一个开源框架,是基于 HTTP2 设计的~所以 gRPC 的优点自然也包含了HTTP2 的优点:
- 数据传输二进制分帧
- 多路复用
- 服务端推送
- 头部压缩
是怎么传输的?
从上图和文档中可以看出,用 gRPC 来进行远程调用服务,客户端( client ) 仅仅需要 gRPC Stub (为啥叫存根?) ,通过 Proto Request 向 gRPC Server 发起服务调用,然后 gRPC Server 通过 Proto Response(s) 将调用结果返回给调用的 client。
JSON-RPC 接口
JSON-RPC 是一种轻量级的 RPC (远程过程调用)协议,可以使用 HTTP 协议进行通信,并以 JSON 格式传输数据。Postman 是一个流行的 API 开发工具,可以轻松地使用它来测试和调用 JSON-RPC 接口。
使用 Postman 发送 JSON-RPC 接口
以下是使用 Postman 调用 JSON-RPC 接口的步骤:
- 第一步:打开 Postman,创建一个新的 HTTP 请求
- 第二步:在请求面板中,选择 HTTP 方法为 POST
- 第三步:输入 JSON-RPC 接口的 URL 地址
- 第四步:在 Body 中选择 raw - JSON,然后输入以下 JSON 格式的数据:
{
"jsonrpc": "2.0",
"method": {{要调用的方法名称}},
"params": {{方法所需的参数}},
"id": {{请求的唯一标识符}}
}
- 第五步:单击 Send 按钮发送请求。如果一切正常,您将在响应面板中看到 JSON 格式的响应数据。
在这个例子中,我们调用名为 echo 的方法,并提供一个对象作为参数。请求的唯一标识符为 123。
使用 Apifox 调试 gRPC
Apifox 支持基于 .proto 文件的 gRPC 调试,包括一元调用和流式调用。在创建项目时「选择 gRPC 项目」-->「导入 .proto 文件」,无需写代码即可直接调用 gRPC 接口。
在调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。如果一个 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。
一元调用
只需要在地址栏填写 URL 后点击「调用」按钮,即可发起一元调用。
流式调用
流式调用包含服务端流、客户端流、双向流。
在发起调用之后,你可以在 Message 标签下撰写消息并发送。Apifox 提供了一个时间线视图,按照时间顺序集中展示调用状态、发送的消息、收到的消息。点击消息之后,可以非常方便地查看消息的详情。
关于 Apifox
Apifox 是一体化 API 协作平台,可以实现 API 文档、API 调试、API Mock、 API 自动化测试,是更先进的 API 设计/开发/测试工具。Apifox 提供了一种全面的 API 管理解决方案。使用 Apifox ,你可以在统一的平台上设计、调试、测试以及协作你的 API,消除了在不同工具之间切换和数据不一致的问题。 简化了你的 API 工作流,并确保了前端、后端和测试人员之间的高效协作。
知识扩展: