【笔记】RPC和REST的区别

我们开发的时候会经常听到rpc方式调用方法。或是说调用RESTful api。 那这RPC和REST到底是什么?有什么区别?

RPC(Remote Promote Call)

RPC是一种进程间通信方式。允许像调用本地服务一样调用远程服务。
RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。
通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于http协议,只是传输协议而已。
简单的实现可以参考spring remoting,复杂的实现可以参考dubbo。

RPC按响应方式分如下两种:
同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作
异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作。

同步调用的实现方式有WebService和RMI。
Web Service提供的服务是基于web容器的,底层使用http协议,因而适合不同语言异构系统间的调用。
RMI实际上是Java语言的RPC实现,允许方法返回 Java 对象以及基本数据类型,适合用于JAVA语言构建的不同系统间的调用。

异步调用的JAVA实现版就是JMS(Java Message Service),目前开源的的JMS中间件有Apache社区的ActiveMQ、Kafka消息中间件,另外有阿里的RocketMQ。

RPC架构里包含如下4个组件:

  1. 客户端(Client):服务调用方
  2. 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方
  3. 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务
  4. 服务端(Server):真正的服务提供者。

具体实现步骤:

  1. 服务调用方(client)(客户端)以本地调用方式调用服务;
  2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在Java里就是序列化的过程
  3. client stub找到服务地址,并将消息通过网络发送到服务端;
  4. server stub收到消息后进行解码,在Java里就是反序列化的过程;
  5. server stub根据解码结果调用本地的服务;
  6. 本地服务执行处理逻辑;
  7. 本地服务将结果返回给server stub;
  8. server stub将返回结果打包成消息,Java里的序列化;
  9. server stub将打包后的消息通过网络并发送至消费方
  10. client stub接收到消息,并进行解码, Java里的反序列化;
  11. 服务调用方(client)得到最终结果。

RPC框架的目标就是把2-10步封装起来,把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。

RPC有比较有名的gRPC架构:
gRPC是一个高性能、通用的开源RPC框架。
其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。 详细的可以自己搜一搜看看。

REST(Representational State Transfer)

REST是Roy Fielding博士在2000年他的博士论文中提出来的一种**【软件架构风格】**。
它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

REST通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST),以URI对网络资源进行唯一标识,
响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
满足REST约束条件和原则的架构,就被称为是RESTful架构。就像URL都是URI(统一资源标识)的表现形式一样,RESTful是符合REST原则的表现形式。

Rest架构的主要原则:

  1. 网络上的所有事物都被抽象为资源
  2. 每个资源都有一个唯一的资源标识符
  3. 同一个资源具有多种表现形式(xml,json等)
  4. 对资源的各种操作不会改变资源标识符
  5. 所有的操作都是无状态的

REST是一种设计风格,它的很多思维方式与RPC是完全冲突的。 RPC的思想是把本地函数映射到API,也就是说一个API对应的是一个function,
能通过某种约定的协议来调用,至于这个协议是Socket、是HTTP还是别的什么并不重要;
RPC中的主体都是 【动作,动词】。
而REST则不然,它的URL主体是 【资源,名词】。 而且也仅支持HTTP协议,规定了使用HTTP Method表达本次要做的动作,类型一般也不超过那四五种。
这些动作表达了对资源仅有的几种转化方式。

总结

RPC更偏向内部调用,REST更偏向外部调用。
RPC强调的是调用的方法。
REST强调的是调用的资源。


欢迎大家的意见和交流

email: li_mingxie@163.com