标签:要求 理解 自动 对象 src 参数 映射 strong mamicode
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个地方(分布到各个服务器),调用者只想要函数运算的结果却不需要了解实现函数的具体细节。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
1、Call ID映射
?? 我们怎么告诉远程机器我们要调用funA而不是funB或者funC呢?在本地调用中函数体是直接通过函数指针来指定的,我们调用funA编译器就自动帮我们调用它相应的函数指针。但是在远程调用中函数指针是不行的,因为两个进程的地址空间是完全不一样的。
所以,在RPC中所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。两者的表不一定需要完全相同但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
如下图:
2、序列化和反序列化
??客户端怎么把参数值传给远程的函数呢?在本地调用中我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时客户端和服务端是不同的进程不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流(编码),传给服务端后,再把字节流转成自己能读取的格式(解码)。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要经过序列化和反序列化的过程。
为什么需要序列化?
3、网络传输
? 远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。
4、RPC的调用流程图
1、所属类别不同
? REST,是Representational State Transfer 的简写,中文描述表述性状态传递(是指某个瞬间状态的资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。REST 是一种软件架构风格。这种风格的典型应用,就是HTTP。而RPC ,是 Remote Procedure Call Protocol 的简写,中文描述是远程过程调用,它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法)。
RPC可以基于TCP/UDP,也可以基于HTTP协议进行传输的。
2、使用方式不同
从使用上来看,HTTP接口只关注服务提供方,对于客户端怎么调用并不关心。接口只要保证有客户端调用时,返回对应的数据就行了。而RPC则要求客户端接口保持和服务端的一致。REST是服务端把方法写好,客户端并不知道具体方法,客户端只想获取资源,所以发起HTTP请求,而服务端接收到请求后根据URI经过一系列的路由才定位到方法上面去,而RPC是服务端提供好方法给客户端调用,客户端需要知道服务端的具体类,具体方法,然后像调用本地方法一样直接调用它。
3、面向对象不同
从设计上来看,RPC所谓的远程过程调用是面向方法的;而REST所谓的Representational state transfer是面向资源的。
4、序列化协议不同
接口调用通常包含两个部分,序列化和通信协议。REST是基于HTTP协议,而RPC可以基于TCP/UDP,也可以基于 HTTP协议进行传输。常见的序列化协议有:json、xml、hession、protobuf、thrift、text、bytes等,REST通常使用的是JSON或者XML,而RPC使用的是JSON-RPC或者XML-RPC。
参考博文:https://blog.csdn.net/daaikuaichuan/article/details/88595202 (rpc简单易懂)
https://baijiahao.baidu.com/s?id=1637758852641939872&wfr=spider&for=pc (rpc与rest的比较理解与实现)
标签:要求 理解 自动 对象 src 参数 映射 strong mamicode
原文地址:https://www.cnblogs.com/jasonboren/p/12543059.html