0

RPC是什么

 2 years ago
source link: https://jiawea.github.io/2020/03/27/RPC/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

说起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端(本地机器):

Service端(远程机器):

总体流程:

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK