RPC是什么

RPC(Remote Procedure Call Protocol)—— 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

​简单来说,就是跟远程访问或者web请求差不多,都是一个client向远端服务器请求服务返回结果,但是web请求使用的网络协议是http高层协议,而rpc所使用的协议多为TCP,是网络层协议,减少了信息的包装,加快了处理速度。

client

说起RPC,就不能不提到分布式(促使RPC诞生的领域)。

举个栗子..

假如你实现了一个计算器接口,Caculator,以及它实现类CalculatorImpl,那么在系统还是单位应用时,只需要new一个CalculatorImpl,然后直接调用其方法,例如addtimes等就可以了,这就是普通的本地调用,因为在同一个地址空间/同一块内存。

但是由于业务上的考虑,基于高性能可靠等因素你得将系统改造为分布式应用。将很多可以共用的分享功能单独做成一个服务,让其他所有服务可以直接调用。

那么问题来了,如何调用这个单独出来的服务呢?

你可能会说,模仿B/S架构方式呀,把单独出来共享服务,这里简称为服务C,提供一个Restful接口,然后用Http调用。

这样确实可以实现,那这样就每次调用都需要发送一连串的的Http请求了,如request.get()等。那能不能像本地调用一样呢?此时RPC的作用到了。使用代理模式,让用户直接引入服务C提供的类。而代理内部就是通过Htpp或者TCP/UPD来实现RPC远程过程调用的。

说到这,总结一下RPC要解决的问题:

  • 解决分布式系统中,服务之间的调用问题。
  • 远程调用时,要能够像本地直接调用一样方便,用调用者感觉不到是在远程调用

实现一个RPC

RPC工作流程

  1. 本地调用某个类的函数方法
  2. 本地机器的RPC框架把这个调用信息封装起来(调用函数、入参、提供服务机器地址端口等),将数据序列化成JSON或者XML后以二进制的方式通过网络传输(如Socket)发送给远程服务器
  3. 远程服务器收到调用后,远程机器的RPC框架获取二进制数据后反序列化出来,并根据调用信息定位到实现要执行的方法,执行完后序列化结果,通过网络传输把执行结果发送回本地机器。
  4. 本地机器的RPC框架反序列化出执行结果。

Client端(本地机器):

client

Service端(远程机器):

service

总体流程:

rpc

问题

如何解决通讯问题?
客户端和服务器之前建立TPC连接,远程过程调用的所有交换数据都在这个连接里传输。连接可以是按需连接,调用结束后断开链接。

如何解决寻址问题?
客户端机器应用要怎么告诉底层RPC框架,如何连接到服务端机器(主机/IP、端口),方法名称是什么,这样才能调用。