RPC(Remote Procedure Call Protocol)—— 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
简单来说,就是跟远程访问或者web请求差不多,都是一个client向远端服务器请求服务返回结果,但是web请求使用的网络协议是http
高层协议,而rpc
所使用的协议多为TCP
,是网络层协议,减少了信息的包装,加快了处理速度。
说起RPC
,就不能不提到分布式
(促使RPC诞生的领域)。
举个栗子..
假如你实现了一个计算器接口,Caculator,以及它实现类CalculatorImpl,那么在系统还是单位应用时,只需要new一个CalculatorImpl,然后直接调用其方法,例如add
,times
等就可以了,这就是普通的本地调用
,因为在同一个地址空间/同一块内存。
但是由于业务上的考虑,基于高性能可靠等因素你得将系统改造为分布式应用
。将很多可以共用的分享功能单独做成一个服务,让其他所有服务可以直接调用。
那么问题来了,如何调用这个单独出来的服务呢?
你可能会说,模仿B/S架构方式呀,把单独出来共享服务,这里简称为服务C
,提供一个Restful
接口,然后用Http
调用。
这样确实可以实现,那这样就每次调用都需要发送一连串的的Http
请求了,如request.get()
等。那能不能像本地调用一样呢?此时RPC
的作用到了。使用代理模式
,让用户直接引入服务C
提供的类。而代理内部就是通过Htpp
或者TCP/UPD
来实现RPC
远程过程调用的。
说到这,总结一下RPC
要解决的问题:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地直接调用一样方便,用调用者感觉不到是在远程调用
实现一个RPC
RPC工作流程
- 本地调用某个类的函数方法
- 本地机器的
RPC
框架把这个调用信息封装起来(调用函数、入参、提供服务机器地址端口等),将数据序列化成JSON
或者XML
后以二进制的方式通过网络传输(如Socket)发送给远程服务器 - 远程服务器收到调用后,远程机器的
RPC
框架获取二进制数据后反序列化出来,并根据调用信息定位到实现要执行的方法,执行完后序列化结果,通过网络传输把执行结果发送回本地机器。 - 本地机器的
RPC
框架反序列化出执行结果。
Client端(本地机器):
Service端(远程机器):
总体流程:
问题
如何解决通讯问题?
客户端和服务器之前建立TPC
连接,远程过程调用的所有交换数据都在这个连接里传输。连接可以是按需连接,调用结束后断开链接。
如何解决寻址问题?
客户端机器应用要怎么告诉底层RPC
框架,如何连接到服务端机器(主机/IP、端口),方法名称是什么,这样才能调用。