概念
RPC(Remote Procedure Calls,远程过程调用),是一种进程间的通信方式,其强调的点在于“远程”,即通过该种方式,能够让我们像本地调用一样实现与远程进程的通讯。
通俗一点来说,同样一个方法A,在没有使用RPC的时候,我们只能在本机器上调用该方法;使用RPC之后,A方法的代码在另一台机器上运行,但是我们也可以使用本机通过RPC对A方法进行调用
意义
业务规模的不断增大,给技术团队带来的影响主要有以下几个:
-
团队成员规模不断扩大
-
技术栈(尤其是语言栈)不断复杂并且多样
-
系统功能越来越多
对应上面三点影响,我们看下使用和不使用RPC的区别。
不使用RPC(代表着单体应用):
-
多人同时对同一套代码进行开发,代码维护成本高,错误率高,效率低
-
不同语言的系统之间通讯成本高
-
系统扩展性差,功能的增多给系统带来更多的压力,系统容错率降低,出错风险高
使用RPC(微服务化):
-
不同团队维护不同的代码,降低开发成本和风险
-
不同语言的系统之间通讯无障碍
-
系统扩展性强,原来的压力分散到了各个微服务上,容错率大大提高
因此,RPC很有意义
基本原理
RPC模型
上图是RPC概念最早的提出者Bruce Jay Nelson在上世纪80年代发表的论文《Implementing Remote Procedure Calls》中提出的RPC模型的组成部分,在他看来,RPC由以下5个部分构成:
-
server
-
client
-
server-stub
-
client-stub
-
RPCRuntime
我们根据上图可以很清晰的明白各个部分的职责:
-
server即服务端,当它收到客户端的请求后,会调用真实的方法并返回结果
-
client即客户端,它通过RPC对server提供的方法进行调用,并获取返回结果
-
server-stub和client-stub都是用来对请求参数或者返回参数进行编码或者解码
-
RPCRuntime负责实现网络传输
RPC过程
-
客户端调用本地代理
-
本地代理对客户端的请求进行序列化并发起网络请求,等待返回结果
-
服务端也有个代理,它接受到网络请求之后会对请求参数进行反序列化,并对真实的方法进行调用,对返回结果进行序列化并发出网络请求返回结果
-
客户端代理接受到返回结果后对返回结果进行反序列化并将结果交给客户端发起调用的方法
RPC关键协议
在RPC中,最重要的是两个协议,一个是序列化协议,一个是数据传输协议,这两个协议确定了,就可以进行rpc了。
-
序列化协议描述了数据的组织形式,试想两人要交流,他们需要使用同样的语言,对方才能明白其中的含义;同样,序列化协议就是两个交互机器的语言,二者通过同样的序列化协议,就能够识别相同的数据,从而让rpc具有意义。常见的序列化协议:JSON、XML、IDL、protobuf、hessian等
-
数据传输协议描述了两端进行通信的方式,说白了就是网络协议。常见的数据传输协议如HTTP、tcp等