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 远程调用!

  • 相关阅读:
    URL中 # (hash)的含义
    哈弗曼树的理解和实现(Java)
    树、森林和二叉树的转换
    后序线索化二叉树(Java版)
    线索二叉树的理解和实现(Java)
    彻底理解线索二叉树
    链式二叉树的实现(Java)
    数和二叉树的基本概念和类型
    数据结构:广义表的实现(Java)
    正则表达式要转义的字符集
  • 原文地址:https://www.cnblogs.com/everlose/p/12779273.html
Copyright © 2011-2022 走看看