RPC与REST的异同
REST与RPC的区别
网络模型
层数 | 名称 | 说明 |
---|---|---|
1 | 应用层 | 定义了用于在网络中进行通信和传输数据的接口 |
2 | 表示层 | 定义不同的系统中数据的传输格式,编码和解码规范等 |
3 | 会话层 | 管理用户的会话,控制用户间逻辑连接的建立和中断 |
4 | 传输层 | 管理网络中的端到端的数据传输 |
5 | 网络层 | 定义网络设备间如何传输数据 |
6 | 链路层 | 将上面的网络层的数据包封装成数据帧,便于物理层传输 |
7 | 物理层 | 传输二进制数据 |
实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面,因为RPC主要是基于TCP/IP协议(传输层协议),HTTP主要是基于HTTP协议(应用层协议)。
REST
REST即表述性状态传递(Representational State Transfer,简称REST),是一种软件架构风格。REST通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST) ,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
Rest架构的主要原则:
- 网络上的所有事物都被抽象为资源
- 每个资源都有一个唯一的资源标识符
- 同一个资源具有多种表现形式(xml,json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
其中表述性状态,是指(在某个瞬间状态的)资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。
其中无状态通信,是指服务端(响应端)不保存任何与特定HTTP请求相关的资源,应用状态必须由请求方在请求过程中提供。要求在网络通信过程中,任意一个Web请求必须与其他请求隔离,当请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息。
REST使用HTTP+URI+XML /JSON 的技术来实现其API要求的架构风格:HTTP协议和URI用于统一接口和定位资源,文本、二进制流、XML、JSON等格式用来作为资源的表述。
RPC
Remote Procedure Call,远程过程调用,就是像调用本地方法一样调用远程方法。RPC架构图:
RPC框架架构
RPC架构分为三部分:
- 服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
- 服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
- 服务消费者,运行在客户端,通过远程代理对象调用远程服务。
RPC框架的核心组件
RPC框架包含4个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub可以理解为存根
- 客户端(Client),服务的调用方。
- 服务端(Server),真正的服务提供者。
- 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
- 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法
RPC框架要做到最基本的3件事情:
- 服务端如何确定客户端要调用的函数
在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表,ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
- 如何进行序列化和反序列化
客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。
- 如何进行网络传输
多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而HTTP在实际应用中更加的灵活
RPC与REST比较
- RPC:所谓的远程过程调用 (面向方法)
- REST:所谓的 Representational state transfer (面向资源)
- RPC 即远程过程调用, 很简单的概念, 像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的只是传输数据的格式
- REST 的三个要素是 唯一的资源标识, 简单的方法 (此处的方法是个抽象的概念),一定的表达方式。重要的特性:无状态
比较项 | REST | RPC |
---|---|---|
通信协议 | HTTP协议 | 一般使用TCP协议 |
性能 | 低 | 高 |
灵活性 | 高 | 低 |
从使用方面看,Http接口只关注服务提供方(服务端),对于客户端怎么调用,调用方式怎样并不关心,通常情况下,客户端使用Http方式进行调用时,只要将内容进行传输即可,这样客户端在使用时,需要更关注网络方面的传输,比较不适用与业务方面的开发;(restful是服务端把方法写好,客户端通过http方式调用,直接定位到方法上面去。)
而RPC服务则需要客户端接口与服务端保持一致,服务端提供一个方法,客户端通过接口直接发起调用,业务开发人员仅需要关注业务方法的调用即可,不再关注网络传输的细节,在开发上更为高效。(PRC是服务端提供好方法给客户端调用。定位到类,然后通过类去调用方法。)
参考内容
- https://blog.****.net/u014590757/article/details/80233901
- https://blog.****.net/zhailihua/article/details/90581365