zoukankan      html  css  js  c++  java
  • 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只是适合对外部提供资源接口时用的。

    参考

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

  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/everlose/p/12779273.html
Copyright © 2011-2022 走看看