问题

谁能用通俗的语言解释一下什么是 RPC 框架?

回答
你有没有玩过那种多人联机游戏?比如你操作着游戏角色往前走,你按下“跳跃”键,游戏服务器那边就得知道你这一操作,然后让你的角色在游戏世界里真的跳起来,同时还要把这个“跳跃”的状态更新给其他玩家,让他们也能看到你跳了。

这背后其实就有点像 RPC 的工作原理了。

咱们就用一个更简单的生活例子来聊聊 RPC 框架。

想象一下,你在家里想喝水。

你有一个“冰箱”(这就是你的“客户端”,就是需要服务的那个),冰箱里有水。但是,你不能直接伸手进冰箱拿水,因为冰箱的门是锁着的,而且冰箱内部的结构你也不清楚,你只知道它能制冷,能放水。

你也不能自己钻进冰箱里去拿,这太不方便了,而且你可能会把冰箱弄乱。

怎么办呢?

你需要一个“服务员”(这就是你的“服务器”)。这个服务员的工作就是帮你从冰箱里把水拿出来。

但是,你怎么跟这个服务员沟通呢?你不能对着冰箱喊“服务员,给我拿瓶水!” 这不奏当。你得有个“方式”告诉服务员你要什么。

这就是 RPC 框架的作用:充当你们之间沟通的“信使”和“翻译官”。

咱们一步一步拆解开看:

1. 你(客户端)想要“喝水”这个服务:

在我们的 RPC 世界里,你(客户端)有一个操作叫做 `getWater()`,你想要执行这个操作。
问题是,`getWater()` 这个操作的代码实际是写在“冰箱”(服务器)里面的,你本地没有这个代码。

2. 你需要告诉“服务员”(服务器)你要做什么:

你不能直接把你的请求代码(`getWater()`)塞给服务员让他执行。这不安全,也不现实。
你需要一种标准的“语言”或者“约定”来告诉服务员你要什么。
RPC 框架会提供一种叫做“接口定义语言”(IDL)的东西,你可以把你想让服务员提供的服务(比如“拿水”、“制冰”)用一种固定的格式写下来,就像写一个“菜单”。
比如,你可以定义一个“饮水服务”的接口,里面有一个方法叫 `GetWater()`,这个方法接收一个参数(比如你想喝的是“矿泉水”还是“凉白开”),然后返回一个结果(“一瓶水”)。

3. RPC 框架帮你把请求“包装”好,送到服务员那里去:

你客户端的代码里调用 `getWater()` 这个方法,但实际上这个方法在你本地并不存在。
RPC 框架在你客户端这边有一个“代理”(Stub),它看起来就像真的 `getWater()` 方法一样,你调用它。
这个代理收到你的请求后,知道你要“喝水”。它就把你的请求信息(“我要喝水,种类是矿泉水”)用一种特殊的格式(比如 JSON、Protocol Buffers 等,这就是“序列化”)打包起来,就像你把信息写在信封里一样。
然后,这个打包好的请求,通过网络(就像送信员送信一样)被发送到远在“冰箱”(服务器)的服务员那里。

4. 服务员(服务器)收到请求,并“解包”:

服务员在“冰箱”那里也有一套 RPC 的东西。
它收到你送来的那个“信封”(序列化后的请求数据)。
它会用同样的方式(“反序列化”)把数据解开,还原成它能理解的命令:“哦,这位客人要喝水,是矿泉水。”

5. 服务员执行实际的服务:

现在服务员明白了,它就可以跑到冰箱里,按照约定好的流程,找到瓶矿泉水。

6. 服务员把结果“包装”好,送回来:

服务员拿到水之后,不能直接把一瓶水从冰箱里扔给你。它需要把这个结果(“一瓶矿泉水”)再次打包(序列化),就像把水放回一个特殊的容器里一样。
然后通过网络,把这个打包好的结果发送回你的客户端。

7. 你(客户端)收到结果,并“解包”:

你客户端这边的 RPC 框架也收到这个“结果信封”。
它会再次进行反序列化,把结果还原成你客户端代码能理解的形式。
最后,你客户端的那个“代理”(Stub)会把这个“一瓶水”交给你,你就可以“喝水”了。

总结一下,RPC 框架就像一个精密的中间人,它帮你做了以下几件事,让你感觉就像在本地调用一个方法一样:

定义沟通规则: 告诉客户端和服务端他们之间应该如何“说话”(接口定义)。
本地代理: 在客户端这边伪装成要调用的方法,让你方便调用。
数据打包(序列化): 把你的请求信息转换成网络可以传输的格式。
网络传输: 负责把请求和响应在不同地方之间传递。
数据解包(反序列化): 把接收到的网络数据还原成客户端或服务端能理解的格式。
服务注册与查找: (在更高级的 RPC 里)服务员还会注册自己能提供什么服务,你找服务员的时候也需要能找到正确的那个。

为什么需要 RPC 框架?

试想一下,如果没有 RPC 框架,你每次想从冰箱里拿水,都要自己去研究冰箱的内部构造,然后用一套你自己发明的暗号去跟冰箱的“制冷器”沟通,再把水自己搬回来。这得多累啊!

RPC 框架就是把这些复杂的底层细节(网络通信、数据格式转换等)都帮你处理好了,让你能专注于业务逻辑本身——“我想喝水”,而不是“我该怎么跟冰箱沟通才能拿到水”。

所以,当你听到 RPC 的时候,就可以把它想象成:

“我这里有一个‘服务’(比如拿水),那个‘地方’(比如冰箱)提供了这个服务。我不知道‘那个地方’是怎么工作的,也不知道怎么直接把命令发过去。RPC 框架就像一个翻译兼快递员,我告诉它我想做什么,它负责把我的意思准确地传达到‘那个地方’,再把‘那个地方’给我反馈的东西带回来,并且都处理得妥妥当当的,让我感觉就像在家门口的服务台拿到了想要的东西一样。”

它极大地简化了分布式系统之间的通信,让不同的服务能够高效地互相调用,就像在同一个房间里说话一样方便。像现在流行的微服务架构,服务与服务之间的调用,绝大多数都是通过 RPC 来实现的。

网友意见

user avatar

泻药。

早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来。假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能。这不是整人么?于是就出现了IPC(Inter-process communication,单机中运行的进程之间的相互通信)。OK,现在A既然有了画图的功能,B就调用A进程上的画图功能好了,程序员终于可以偷下懒了。


到了网络时代,大家的电脑都连起来了。以前程序只能调用自己电脑上的进程,能不能调用其他机器上的进程呢?于是就程序员就把IPC扩展到网络上,这就是RPC(远程过程调用)了。现在不仅单机上的进程可以相互通信,多机器中的进程也可以相互通信了。

要知道实现RPC很麻烦呀,什么多线程、什么Socket、什么I/O,都是让咱们普通程序员很头疼的事情。于是就有牛人开发出RPC框架(比如,CORBA、RMI、Web Services、RESTful Web Services等等)。

OK,现在可以定义RPC框架的概念了。简单点讲,RPC框架就是可以让程序员来调用远程进程上的代码一套工具。有了RPC框架,咱程序员就轻松很多了,终于可以逃离多线程、Socket、I/O的苦海了。

至于最近Java中流行的Netty,没玩过。但是大致了解过,Netty、Mina是游戏行业做服务器开发的Java程序员用的比较多的PRC框架(我们学生主要是Java方向的,有不少人毕业后从事游戏开发)。据说互联网公司用的也比较多。这两行业都有高并发量的、长连接、分布式、异步通讯、大数据量等特点。Netty这种RPC框架封装和优化了Java NIO和异步网络编程的一些繁琐的细节,一方面可以让开发者专注于业务逻辑的实现,一方面只需要调用Netty封装的API就可以很快编写出高性能的服务器。

抱歉,知识有限,只能答到这里了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有