RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用。RPC的出现其实主要是为了解决分布式系统间的通讯透明性的问题。编程
那什么是分布式系统的通讯透明性问题?这个问题就是指分布式系统间的相互调用实际上是基本进程间的显式消息交换,然而,消息的发送和接收过程没法隐藏。而通讯的隐藏对于分布式中实现访问的透明性是极为重要的。试想一下好比你要想查看一个订单详情,而后订单系统部署了三台机器。假设没有RPC,其它系统想经过调订单系统查询订单详情的信息,就必须知道订单系统部署机器的ip和端口,每一个调用者必须关注订单系统新加或者下线和换机器部署等情景。试想这对调用者来讲是有多蛋疼。换言之分布式系统通讯就应该是透明的,这样调用者就不须要关心调用的是那台机器上面的服务。在调用者的角度这个远程服务应该和调用本地服务同样是一个单一稳定可靠的服务。数组
基于这样的背景有人就提出了一种与传统方法大相径庭的通讯手段:不一样机器上的进程是容许相与调用的,当机器A上的进程调用机器B上的进程时,A上的调用进程被挂起,而B上的被调用进程开始执行。调用方能够经过使用参数将信息传送给被调用方,而后能够经过传回的结果获得信息。编程人员看不到任何消息传递过程。这个方法就被程为远程过程调用RPC.服务器
在介绍RPC以前咱们先来看常规过程调用。好比咱们定义一个c语言的方法网络
count = read(fd,buf,nbytes); 这里fd为一个整形数,表示一个文件,buf为一个字符数组,用于存储读入的数据,nbytes为另外一个整数,用于记录实际读入的字节数。当在主程序调用这个方法时实际的执行过程是先把参数压入堆栈中架构
而后程序读取堆栈里面的参数,执行系统的库函数,其中还包括执行线程从用户态到内核态的切换,执行完毕后又从内核态到用户态的转换过程。这些于调用者来讲都是不可见和不用关心的。框架
RPC的设计思想其实与常规过程调用相似,屏蔽底层的细节使程序不知道调用的业务逻辑是在另外一台机器上面处理的使其专一于自身业务逻辑处理。正常的RPC调用过程异步
举一个远程调用两个数求和的详细调用过程分布式
这里面出现了两个名词客户端存根、服务端存根。 其实客户端存根指的就是咱们如今RPC框架中的client端,服务端存根就是server端,只是不叫法而已。客户端存根的做用是把请求的参数以约定的通信协议打包好发送给服务端而后解析服务端返回消息,服务端存根就是根据收到的请求信息执行相应的业务逻辑调用并把结果返回客户端。要定义一个RPC框架首先要定义好通信格式,由于最络从网络层解析出来的数据都是以字符串的形式解析出来的.咱们须要从这一串字符中解析出调用哪一个服务,服务入参是什么。函数
通常来讲客户端存根会把调用类名称传给服务端,服务端存根根据这个名称找到对应的service的映射,就知道调哪一个服务了。因此服务端存根要保存一份service的映射关系。一样客户端存根收到响应后会唤醒以前调用的线程或者等待以前的线程运行处理返回的结果。 性能
解决了RPC的调用问题,如今还要解决的一个关键问题是,客户端怎么知道调用哪一台机器上的服务。这就须要引入一个中间的第三者目标服务器。
服务提供者向目标服务器注册服务,客户机从目标服务器(一种叫法叫服务注册中心)中获取可调用的机器列表。若是有用过相似dubbo这样的RPC框架是否是对这个图很熟悉?由于全部的RPC架构的原理大多都是相似的。服务提供者往目标服务器里面一般会注册机器的ip和端口信息。
下面咱们来谈下RPC的好处和注意的地方。
好处:屏蔽了底层通信的复杂性,在分布式系统中提供了通信的透明性。
须要注意的地方:RPC是点对点的通信方式,要求通信两端必须同时运行,当其中一端挂了就会致使一般异常,而且调用者通常会阻塞住等待结果的返回,性能相对不是很高,固然也有异步RPC,超时重试状况下服务端提供者须要作好服务幂等性处理。相对于RPC而言采用了面向消息通信模型的架构好比MQ则不要求通信两端同时运行,发送消息时也不须要阻塞等待处理结果的返回通信性能就高出不少。
最后咱们总结一下:RPC调用是指不一样机器间的进程通信。程序不须要关心某个远程服务是在哪台机器上执行的,远程服务调用就和调用本地服务同样。要在不一样机器间进行通信咱们须要知道通信机器的ip和端口号。ip帮助咱们定位是哪一台机器,端口号帮咱们定位是机器上的哪个进程。RPC的出现使用得机器的进程通信透明化,这在分布式系统中是很重要的。RPC调用架构中客户端和服务端都和一个叫服务注册中心的第三方通信。