RPC 和 REST 有什么优劣
介绍
这源自一个我面试时的问题,当聊到 REST API,面试官问:RPC 和 REST 有什么优劣?
首先 REST 就是 RESTful API,它是基于 http 的,形式大概是这样子的
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
// 比如说有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
// 略过增删改的介绍
那么 RPC 呢?它的一个经典案例就是 Dubbo 接口,可以基于 socket 也可以基于 http,文档参见 dubbo-js
url格式 protocol://username:password@host:port/path?key=value&key=value
protocol 可以是 dubbo://
01、所属类别不同
REST(RESTful) 是一种软件架构风格。这种风格的典型应用,就是HTTP。其因为简单、扩展性强的特点而广受开发者的青睐。
而 RPC 呢,是 Remote Procedure Call Protocol 的简写,中文描述是远程过程调用,它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法)。
而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的,按理说它和REST不是一个层面意义上的东西,不应该放在一起讨论,但是谁让REST这么流行呢,它是目前最流行的一套互联网应用程序的API设计标准,某种意义下,我们说 REST 可以其实就是指代 HTTP 协议。
02、使用方式不同
从使用上来看,HTTP 接口只关注服务提供方,对于客户端怎么调用并不关心。接口只要保证有客户端调用时,返回对应的数据就行了。而RPC则要求客户端接口保持和服务端的一致。
REST 是服务端把方法写好,客户端并不知道具体方法。客户端只想获取资源,所以发起HTTP请求,而服务端接收到请求后根据URI经过一系列的路由才定位到方法上面去
RPC是服务端提供好方法给客户端调用,客户端需要知道服务端的具体类,具体方法,然后像调用本地方法一样直接调用它。
03、面向对象不同
从设计上来看,RPC,所谓的远程过程调用 ,是面向方法的 ,REST:所谓的 Representational state transfer ,是面向资源的,除此之外,还有一种叫做 SOA,所谓的面向服务的架构,它是面向消息的,这个接触不多,就不多说了。
04、序列化协议不同
接口调用通常包含两个部分,序列化和通信协议。
通信协议,上面已经提及了,REST 是 基于 HTTP 协议,而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的。
常见的序列化协议,有:json、xml、hession、protobuf、thrift、text、bytes等,REST 通常使用的是 JSON或者XML,而 RPC 使用的是 JSON-RPC,或者 XML-RPC。
为什么要采用RPC呢?
“远程调用”意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个地方(分布到各个服务器),调用者只想要函数运算的结果,却不需要实现函数的具体细节。
RPC 面向方法,主要用于函数方法的调用,可以适合更复杂通信需求的场景。如 rpc + ralbbimq中间件可以实现低耦合的分布式集群架构。
RPC 的案例就是 Dubbo 接口。
REST只是适合对外部提供资源接口时用的。