用通俗的语言讲RPC原理

各位吴彦祖&刘亦菲你好,俺是一名偷偷卷RPC的程序员龙哥😉

开始之前看下大纲

请仔细看

本文努力做到通俗一点,也画图辅助你理解,提到俺接下来的flag俺不会忘记,主要是尝试理解并慢慢深入RPC,最终能自己实现一个简单的RPC。这是系列的开篇。当然只有自己亲身理解做过,俺才会讲给同志们,我也把基础的知识点全面在系列梳理一遍,2022年做点有意义的,希望多多支持。

1 RPC定义的理解

RPC(Remote Procedure Call)翻译过来 远程过程调用,简单解释下字面的意思哈,远程肯定是指要跨机器而不是本机啦,所以要用网络才能实现,但是不是说只能通过网络通信访问到另外的一台主机的应用程序,就可以称为RPC调用了,那就大错特错了,这显然还远远不够。

还有,它是种通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常是一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互动作编程了,就是不用关注细节,同时 RPC 也是遵循 CS 这种模式。

再想下 [过程] 这个词感觉那里听说过,我学C的时候听说过,也不知道最开始谁翻译的,俺觉得程序,服务,方法,这几个都比[过程]要好,可能大神不一样吧。

好吧,为了后面咱们能够好理解,我们统一一下叫法,干脆叫,远程服务调用,服务就包括程序接口,方法等一类的资源。

最后我们看 调用, RPC 是一种进程间通信的模式,程序是分布在不同的地址空间里。如果在同一主机里,RPC 可以通过不同的虚拟地址空间(即便使用相同的物理地址)进行通讯,而在不同的主机间,则通过不同的物理地址进行交互。许多技术都是基于这种概念而实现的。

听懂了些,好像又没完全懂,那说人话吧。比如说两台服务器:A 和 B,一个应用部署在 A 服务器上,想要调用 B 服务器上某个应用提供的函数/方法,下面画的这样。

总结下,俺的理解 RPC 是帮助我们屏蔽网络编程的细节,实现调用远程方法就跟调用本地(同一个项目中的方法)是一样的,不需要因为这个方法是远程调用就需要编写很多业务无关的代码,这是不需要。

这就好比在修在小河的桥一样,它连着河的两岸,如果没有桥了,你只能通过划船,绕道等方式才能到达河对面。

但是现在是有桥走的,这跟路上走到河对面有啥区别呢?没得啥区别啊。

确实有点抽象,俺再举个例子再加深一点对 rpc 印象

现在呢假设你有一个计算器接口,叫作Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体的时喉,你要调用 Calculator接口 的add方法来执行一个加法运算,直接 new 一个 CalculatorImpl,然后调用 add方法 就行了,这其实就是非常普通的本地方法调用,这个我会在下面描述。本地嘛,因为在同一个地址空间,或者说在同一块内存,所以通过方法栈和参数栈就可以实现啦。

但是大事不妙,我们要考虑高性能和高可靠的因素啦,你决定把它改成分布式应用,将很多可以共享的功能都单独做出来,比如上面说到的计算器,你就单独把它放到一个服务里头,让别的服务去调用它。

这下问题来了啊,服务A 里面并没得 CalculatorImpl 这个类,那我要咋调 服务B 的 CalculatorImpl 的add方法呢?

有兄弟会说,你可以模仿 B/S 的那调用方式呀,在 B服务 暴露一个Restful接口,然后 A服务 通过调用这个 Restful接口 来间接调用 CalculatorImpl 的 add方法不就行了。

很好,这已经有点接近RPC了,但是如果是这样,那我每次调用时,那是不是都需要写一串发起 http请求 的代码呢?比如 httpClient.sendRequest…之类的,也太麻烦了吧,能不能跟本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程呢,像这样:


@Reference
private Calculator calculator;

...

calculator.add(1,2);

...

这时候,有兄弟就会说,你可以用代理模式嘛!而且最好是结合Spring IoC一起用,通过 Spring 注入 calculator对象,注入的时候,如果扫描到对象加了 @Reference 注解,那就给它生成一个代理对象,将这个代理对象放进容器里面去。而这个代理对象的内部,就是通过 httpClient 来实现RPC远程过程调用的。

可能上面这段描述比较抽象,不过这就是很多RPC框架要解决的问题和解决的思路,比如阿里著名的Dubbo。

所以总结俺认为,RPC 的作用就是两个方面:

  • 屏蔽远程调用和本地调用的区别,让我们感觉调项目内的方法一样的

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙哥手记

非常感谢你的赞赏,一起加油整起

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值