回顾 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 框架中主要有三个角色:Provider、Consumer 和 Registry。如下图所示:
Server: 暴露服务的服务提供方
Client: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心
RPC 怎么调用 ?
由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。
我们的目标是要把 二~八 步,封装起来,让用户对这些细节透明
怎么封装通信细节才能让用户像以本地调用方式调用远程服务呢?对Java来说就是使用代理!java代理有两种方式:
- jdk 动态代理
- 字节码生成。
一旦确定了消息的数据结构后,还要考虑序列化与反序列化了。
下一步就要进行网络通信了
- 使用 java nio 方式自研
- 基于 mina
- 基于 netty
RPC 调用过程中如何让别人使用我们的服务呢?
我们可以使用 zookeeper ,zookeeper 可以当成一个 Service Registry,也就是 服务注册表,他可以集群多个服务提供者,这样的话消费者可以通过注册表或得到通知。如下图所示:
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 发送 JSON-RPC 接口
使用 Apifox 也能发送 JSON-RPC 接口,并且 Postman 到 Apifox 几乎是无缝衔接的,且 Apifox 支持中文显示,非常方便上手~
关于 Apifox
- 集成了 API 文档、API 调试、API Mock、API 自动化测试 API 一体化协作平台
- 拥有更先进的 API 设计/开发/测试工具
- Apifox = Postman + Swagger + Mock + JMeter
知识扩展:
了解更多 RPC 相关知识: