RPC 远程接口调用:详解实现和优化

本文将详细介绍 RPC 远程接口调用的实现和优化,包括协议、传输、序列化等方面。

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

RPC 远程接口调用:详解实现和优化

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

回顾 RPC 调用过程

  • 第一步:服务消费方(client)调用以本地调用方式调用服务;
  • 第二步:client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  • 第三步:client stub 找到服务地址,并将消息发送到服务端;
  • 第四步:server stub 收到消息后进行解码;
  • 第五步:server stub 根据解码结果调用本地的服务;
  • 第六步:本地服务执行并将结果返回给server stub;
  • 第七步:server stub 将返回结果打包成消息并发送至消费方;
  • 第八步:client stub 接收到消息,并进行解码;
  • 第九步:服务消费方得到最终结果。

为什么要用 RPC

举个例子,如果酒店里只有一个厨师,他要负责洗菜、切菜、炒菜这几件事情。这就是以前的单体计算机,一台计算机就要完成很多事情:

制作番茄炒蛋{
    厨师->洗菜->切菜->炒菜
}

但是这样效率低啊,啥都厨师来做,他一个人忙不过来,于是酒店招了备菜师、切菜师这两个岗位,来协助厨师做事,这让厨师没那么忙了~

但是问题又出现了,切菜师想要切菜得等备菜师洗完菜,厨师想要炒菜得先等切菜师切完菜。

制作番茄炒蛋{
    备菜师->洗菜
    切菜师->切菜
    厨师->炒菜
}

这种情况下,酒店就得多招几个人来协助厨师,最终目的是炒菜。而他在通知备菜师帮他洗菜,通知切菜师傅帮他切菜的时候,这个过程就是远程调用。

一般酒店流程是顾客下单后,服务员把单拿到厨房,并且分发给备菜师、切菜师和厨师。这个过程就和计算机系统很像了。

如今的大型网站都是分布式部署的。拿一个下单流程来说,可能涉及到物流、支付、库存、红包等多个系统后,而多个系统又是分别部署在不同的机器上的,分别由不同的团队负责。而要想实现下单流程,就需要用到远程调用。

RPC 远程调用

RPC 是什么

RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。

RPC 指的是,端 A 上有一个进程,调用了端 B 上的一个进程,然后端A的进程会被挂起,端B上的进程被调用并且执行,然后端B执行完把结果返回给端 A。端A可以传参给端 B,并且得到端 B 执行后的结果。

就像后厨的例子一样,服务员把菜单传给后厨,厨师告诉备菜师和洗菜师开始工作,然后他等待他们完成工作。备菜师和洗菜师工作完之后,厨师开始炒菜。这个过程对于服务员来说其实是透明的,他不需要关心到底后厨是怎么做菜的。

RPC 远程接口调用
示例图

在 RPC 框架中主要有三个角色:Provider、Consumer 和 Registry。如下图所示:

RPC 远程接口调用
RPC 框架
Server: 暴露服务的服务提供方
Client: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心

RPC 怎么调用

由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

RPC 远程接口调用
示例图

我们的目标是要把 二~八 步,封装起来,让用户对这些细节透明

怎么封装通信细节才能让用户像以本地调用方式调用远程服务呢?对Java来说就是使用代理!java代理有两种方式:

  • jdk 动态代理
  • 字节码生成。

一旦确定了消息的数据结构后,还要考虑序列化与反序列化了。

下一步就要进行网络通信了

  • 使用 java nio 方式自研
  • 基于 mina
  • 基于 netty

RPC 调用过程中如何让别人使用我们的服务呢?

我们可以使用 zookeeper ,zookeeper 可以当成一个 Service Registry,也就是 服务注册表,他可以集群多个服务提供者,这样的话消费者可以通过注册表或得到通知。如下图所示:

RPC 远程接口调用

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 格式的响应数据。
Postman 发送 JSON-RPC 接口
Postman

在这个例子中,我们调用名为 echo 的方法,并提供一个对象作为参数。请求的唯一标识符为 123。

使用 Apifox 发送 JSON-RPC 接口

使用 Apifox 也能发送 JSON-RPC 接口,并且 Postman 到 Apifox 几乎是无缝衔接的,且 Apifox 支持中文显示,非常方便上手~

Apifox 发送 JSON-RPC 接口
Apifox

关于 Apifox

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

知识扩展:

了解更多 RPC 相关知识: