介绍

这源自一个我面试时的问题,当聊到 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只是适合对外部提供资源接口时用的。

参考

从 0 到 1:全面理解 RPC 远程调用!