美文网首页
【笔记】RPC和REST的区别

【笔记】RPC和REST的区别

作者: 李明燮 | 来源:发表于2021-06-17 11:12 被阅读0次

    我们开发的时候会经常听到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

    相关文章

      网友评论

          本文标题:【笔记】RPC和REST的区别

          本文链接:https://www.haomeiwen.com/subject/zxnfyltx.html