前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试时候说RPC是协议?今天的面试就到这里,你先回去等通知吧。

面试时候说RPC是协议?今天的面试就到这里,你先回去等通知吧。

作者头像
程序员牛肉
发布2024-09-26 13:24:23
1300
发布2024-09-26 13:24:23
举报
文章被收录于专栏:小牛肉带你学Java

大家好,我是程序员牛肉。

今天在刷订阅号的时候,搜了一下RPC。发现很多公众号都用“协议”来形容RPC。这在我看来是明显是不对的,RPC怎么能算是一种协议呢?

只说PRC或许不太够,也有点难理解。因此我们先说说RPC的好兄弟“LPC”。

LPC(Local Procedure Call,本地过程调用)

LPC是Windows操作系统中的一种进程间通信(IPC)机制。它允许进程间通过发送消息来进行通信,而不需要这些进程在同一个地址空间中运行。LPC主要用于操作系统内核与用户空间进程之间或者用户空间进程之间的通信。

LPC通信基于“端口”的概念,这些端口可以看作是进程间通信的通道。LPC支持同步和异步通信,并且可以处理大量数据的传输。在Windows系统中,LPC可以用于快速的报文传递,它允许进程间发送消息、同步操作等。LPC机制提供了面向报文传递的进程间通信,而LPC则是建立在这个基础上的高层机制,目的是提供跨进程的过程调用。

简单介绍了一下LPC是本地过程调用,那你猜一下RPC的R是哪个单词呢?

当然是Remote了。

RPC(Remote Procedure Call,远程过程调用)

PRC是客户端将调用一个本地方法,而这个本地方法则是负责透明的与远程服务端进行过程间通信。这个本地方法会讲相关参数顺序打包到一个消息中,然后把这个消息发送给服务端提供的方法,服务端的方法会从消息中解出序列化发出来的参数,然后执行,最后仍以同样的方式将方法的返回值发送给客户端。

相信你已经恍然大悟。PRC根本就谈不上所谓的协议,他只是一个“调用远程服务”的行为而已。

论文《Implementing remote procedure calls》对 RPC 做了经典的诠释:它描述了一种通过网络,从远程计算机程序上请求服务,而不需要了解底层网络技术的方法。

相关论文链接 http://mpaxos.com/teaching/ds/20fa/readings/rpc.pdf

试想如果我们自己人为调用远程方法,我想应该要着重关注两点:

  • 远程调用方法是否好用,是否能够像调用内部方法一样便捷?
  • 既然是通过网络通信进行调用远程方法,我们能处理好网络通信嘛?

一说“自己人为调用远程服务”可能会懵,但其实大多数人都有调用远程服务的经历。

想一想你的“苍穹外卖”,在用户下单之后,是不是要用HttpClient进行调用微信支付接口?

这不就是一个远程调用嘛?在苍穹外卖的调用远程服务中,我们是使用HttpClient完成的。

如果你是“苍穹外卖”项目组的同事,评论区集合让我看看🫡。

而如果是那种大型项目呢?如果调用了100个远程服务,我们还要用100次HttpClient嘛?

这个时候“代码复用”四个字涌上心头。

我们可以尝试在远程服务的项目中整两个东西:”请求处理器“和”服务注册器“。

我们的后端只需要传递想要调用的方法,经由目标服务器请求处理器发现对应类,之后通过反射去调用目标类。

在专业的概念中,我们把客户端叫做“调用方”,把“web服务器”叫做服务提供方。

在这个网络传输的过程中,传输的数据格式都是字节流。因此在进行网络传输的时候,还需要对调用的服务对象进行序列化传输。

现在的模式就是:

“调用方”将要调用的方法对象转换成为二进制字节流发送给“服务提供方”,而“服务提供方”要根据传输过来的二进制字节流找到对应的实现类,完成方法调用之后将结果再次序列化为二进制字节流响应给调用方。

但是这样太麻烦了!

在这过程中,“调用方”还需要手动的进行序列化,发送序列化数据,“服务提供商”还要再次进行反序列化拿到对应的方法对象之后,进行调用之后再反序列化成字节流发送给前端

那我们可不可以尝试屏蔽这些细节呢?让使用方只需要关注服务接口,无需其他各种操作。

这玩意不就是动态代理嘛?

搞一个代理类拦截所有的方法调用,在这个里面完成一整套逻辑代码,之后把调用结果返回给调用方,这样的话我们的使用方只需要使用这个代理类就好了。

这不就获得了宛如调用本地接口一般的体验嘛。

OK了,现在我们已经初步设计出了一个RPC框架。当然了,这个RPC框架距离真正的使用还差得远,不过希望你能从中了解到RPC设计的思想。

通过我的介绍,相信你已经了解“什么是RPC”,下次可不要说RPC是一个协议了,他就是一个“屏蔽网络细节来调用远程方法”的行为。

所以我觉得其实“Http”也算是一种RPC的实现方案,不知道你怎么看呢?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员牛肉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档