What?
RPC( Remote Procedure Call),远程过程调用,相比于IPC来说RPC就是基于远程的工作机制,说白了RPC也是一种进程间通信方式,它只不过可以允许本地程序调用另一个地址空间的过程或者函数,而不用程序员去管理调用的细节。对于IPC来说,程序只能调用本地空间的函数,而RPC机制提供了一种程序员不必显示的区分本地调用和远程调用。
原因在于它是一种通过网络通信从远程计算机程序上请求服务,而不需要去了解底层网络技术的协议。RPC机制是假定某些传输协议的存在,比如TCP或者UDP,为通信程序之间携带有效信息,RPC将原来的本地调用过程变为调用远端服务器的方法,如果在OSI网络通信模型中来讲,RPC是跨越了传输层和应用层的。
RPC采用的是客户机/服务器模式。请求程序就是一个客户机,而服务程序就是一个服务器。
首先 ,客户机调用进程发送一个带有进程参数的调用信息到服务进程,然后等待应答信息。然后 ,服务端处于等待状态直到调用信息到达。当调用信息到达后,服务器获得参数,计算结果,发送回复信息,然后继续等待下一个信息到来。最后 ,客户机接受到答复信息,获取回复结果,继续执行。
Why?
一种新技术的出现的目的一定是为了解决某一需求的,如果开发是一个逻辑简单、用户不大、流量不大的程序,那么我们无需解决资源问题,但是往往一个好的程序需要去面对不同的资源分配问题。
以下的两种情况简单介绍一下RPC出现过程:
当系统的访问量突然增长,一台单机的服务器已经无法承受如此多的业务,此时我们可以去增加服务器,将不同的业务部署在不同的服务器上,划清逻辑界限以减少压力。此时也不需要RPC机制,因为各个服务器上运行的是不同的业务。
如果我们业务越来越多,新业务的出现可以需要集合很多旧业务的功能,但是旧的业务是部署在不同服务器上的,此时就出现了一个问题,发现部署在各个服务器上的功能,已经不能简单的划分开了。为了开发这个新的业务,如果开发人员去开发一套新的功能,那么就意味你需要更多的时间和人力以及金钱去搞,这样的代价往往是不能接受的。所以我们只能选择去用旧的业务集成开发出新业务,为了处理新旧业务复用的问题,此时就出现了一个解决方法,可以将公共业务,也就是新业务中都有用到的旧业务,将其逻辑抽离出来,组成一个独立的服务,而原有的、新增的服务都可以去和公共服务去交互,以来完成完整的业务功能。
这时,我们就需要一种高效的不同服务之间可以通信的手段来完成这种需求,因此就出现了RPC。
读过这两段话,其实你也能发现,这就是在描述服务化、微服务和分布式系统架构的基础场景,而RPC就是实现以上结构的一种手段。
RPC
RPC框架
客户端(client):服务的调用方。
客户端存根(client stub):存放服务端的地址信息,再将客户端的请求参数打包成网络数据,然后通过网络远程发送给服务方。
服务端存根(server stub):接受客户端发送过来的消息,将消息解包,并调用本地的方法。
服务端(server):正真的服务提供者。
RPC调用过程
client 以本地调用方式(接口)调用服务。
client stub 接受到调用后,负责将方法,参数等组装成能够进行网络传输的消息体(将消息对象序列化为二进制)
客户端通过sockets将网络消息发送到服务端
server stub 收到消息后节进行解码(将消息对象反序列化)