V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fangcan
V2EX  ›  程序员

rpc 跟 restful 之间有什么关系 ?

  •  
  •   fangcan · 2020-07-15 11:16:33 +08:00 · 4257 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的项目是前后端分离,后端用 springmvc,前端用 vue,基于 http 交互。

    后端接口定义的格式 像 rpc 风格 比如:getUserInfo,queryStoreCouponList

    疑问的地方:

    1. 像这种前后端分离的结构属于 restful 还是 rpc 还是 都不属于?
    2. rpc 跟 restful 之间有什么关系、区别?

    求各位老哥解答

    21 条回复    2020-07-17 14:07:03 +08:00
    ChanKc
        1
    ChanKc  
       2020-07-15 11:19:21 +08:00 via Android
    前后端分离和 restful rpc 都没有关系
    hantsy
        2
    hantsy  
       2020-07-15 11:25:29 +08:00
    Java EE 标准中原来有一个 XML RPC,从 Jakarta EE 9 正式标注为 Pruned,删除。
    基于 SOAP WebService 的相关标准,标注为 Optional,不是强制要求 Provider 实现。
    剩下的只有 JAXRS,基于 REST 的 WebService 了。
    roundRobin
        3
    roundRobin  
       2020-07-15 11:33:51 +08:00   ❤️ 3
    RPC 指的是利用暴露的函数接口通讯的模式,REST 是利用标准接口访问资源的设计模式,前者对内提供微服务,后者对外提供用户服务,前后端分离是项目的设计模式,要具体到内部通讯和外部访问才能和 RPC 或者 REST 扯上关系
    kenzi
        4
    kenzi  
       2020-07-15 11:37:22 +08:00
    再加一点,getUserInfo 这种对于 rest 来说应该是 GET /user/{id}
    gabon
        5
    gabon  
       2020-07-15 11:38:18 +08:00 via Android
    HTTP 也是 rpc
    baiyi
        6
    baiyi  
       2020-07-15 11:43:24 +08:00   ❤️ 1
    @gabon #5 "HTTP is not RPC" —— Fielding Dissertation
    zarte
        7
    zarte  
       2020-07-15 11:44:41 +08:00
    rpc 可以使用 http 协议那就跟 restful 差不多了,但是 rpc 可以自定义协议达到更小的包等优势。
    useben
        8
    useben  
       2020-07-15 11:57:20 +08:00
    一句话, 一个是协议, 一个是设计模式
    iX8NEGGn
        9
    iX8NEGGn  
       2020-07-15 13:00:27 +08:00 via iPhone   ❤️ 2
    后端服务之间远程调用目前两大主流分别是 rpc(远程过程调用) 和 RESTful 风格的 http,rpc 一般工作在应用层以下,而 http 是应用层协议,RESTful 只是 http 调用的一种风格和 rpc 没关系,你前后端交互 API 设计也可以用 RESTful 风格,前后端分离是一种软件设计模式和 RESTful 或 rpc 都没关系
    limuyan44
        10
    limuyan44  
       2020-07-15 13:14:22 +08:00 via Android   ❤️ 1
    java 和 javascript 什么关系他们就什么关系
    Variazioni
        11
    Variazioni  
       2020-07-15 13:25:28 +08:00
    @limuyan44 哈哈哈哈
    qq1340691923
        12
    qq1340691923  
       2020-07-15 17:22:50 +08:00
    @limuyan44 没关系
    fangcan
        13
    fangcan  
    OP
       2020-07-15 17:48:44 +08:00
    @roundRobin 请教下,前端系统能不能理解为一个只调用接口不开放接口的后端程序?
    nthhdy
        14
    nthhdy  
       2020-07-15 18:11:48 +08:00
    https://www.zhihu.com/question/41609070

    我印象最深刻的,是这里面 易哥 的回答
    hcx0
        15
    hcx0  
       2020-07-15 19:50:02 +08:00
    RPC 是一种泛指,Http 只是一种协议,可以通过 http 协议来实现、比如 gRPC 。
    REST 只是 Http 的一种设计风格,跟 RPC 没有必然的联系。
    前后端分离跟 REST 和 RPC 更没有关系。
    另外,虽然拥趸很多,但是 RESTful 风格的接口在国内几乎没有见过。
    js8510
        16
    js8510  
       2020-07-16 06:00:56 +08:00
    RPC: Remote procedure call. restful : Web services that conform to the REST architectural style, called RESTful Web services. 所以 RPC 有很多实现,http,thrift, grpc 等等。restful 是一种 RPC 设计规范。 用 wiki 的话说, 叫 set of constraints to be used for creating Web services. 所以关系大概就是 OS 和 POSIX 的关系。
    sxy960806
        17
    sxy960806  
       2020-07-16 09:48:52 +08:00 via Android
    @kenzi 资源的命名一般用单数还是复数呢?比如我看 github 的 v3api,就是 projects,而 auth 这种不可数的名词没有复数,user 有复数但写成 users 有点奇怪。比较纠结。。。
    kenzi
        18
    kenzi  
       2020-07-16 10:39:09 +08:00
    @sxy960806 上面我是随手写的,具体 project 里,我们一般用复数比较多
    libook
        19
    libook  
       2020-07-16 11:21:48 +08:00   ❤️ 1
    技术圈有个鸭子定律,就是走起来像鸭子、叫起来像鸭子、长得像鸭子,那就可以称之为鸭子。

    RPC 全程是 Remote Procedure Call,中文可以翻译成远程过程调用,所以只要是一个程序里像调用自己的过程一样去调用另外一个程序里的过程(可能是同一台机器上的,也可能是不同机器上的),那么就可以被称之为 RPC 技术。

    REST 是一中 API 设计风格(不是标准,不是标准,不是标准),这种风格是 Roy Fielding 博士于 2000 年发布的论文里提出的,用于解决一些 API 设计问题的风格,感兴趣可以看一看论文原文,篇幅很短。

    REST 是基于 HTTP 来设计的,HTTP 是超文本传输协议,用于实现客户端(浏览器)与服务端之间的数据通信。

    假设你的 VUE 页面以 REST 风格通过 HTTP 这个协议来与服务端的 SpringMVC 程序进行通信,同时 VUE 页面中将这个通信过程封装成了本地的方法,能实现页面业务逻辑可以直接调用本地方法,最终实现与服务器的数据交换;那么就可以说:
    - 这个可以用于与服务器交换数据的方法是一种 RPC 技术。
    - 此 RPC 技术底层使用 REST 风格的 HTTP API 来实现。
    fangcan
        20
    fangcan  
    OP
       2020-07-17 11:59:15 +08:00
    @libook 也就是我所在的项目的前后端分离其实就是 “普通的前端应用以 http 调用后端服务”,调用方式也不是 rpc ;后端服务提供的服务也不是 rest 风格 是这样么?
    libook
        21
    libook  
       2020-07-17 14:07:03 +08:00
    @fangcan 你没有说实现细节,所以我也无法判断。

    RPC 、REST 、前后端分离,三者之间没有任何联系,不互相依赖,也可以共存。就好比是车辆、汽油发动机、出行三者的关系;车辆可以用汽油发动机,也可用柴油发动机甚至电动机;汽油发动机可以给汽车用,也可以给船和发电机用;出行可以选择乘车,也可以选择乘船和飞机甚至自行车。

    RPC 和 REST,一个是针对调用的方式,另一个是针对通信方式,分别看。

    RPC 的精髓是,业务逻辑不需要关心本地的这个方法是如何实现和服务器通信的,本质上是对调用过程的一种封装,这样业务逻辑只需要关心自己的业务逻辑,RPC 只需要关心如何实现远程调用,两者隔离。

    REST 只是一种 API 的设计风格,只要你服务端的 API 风格符合 REST 的特征,那就算是用了 REST 风格。

    所以你搞清楚了之后可以自己判断一下,你现在是否在用 RPC 以及 REST 。

    不过我觉得你目前的思路是本末倒置的。不应该是先做完了一个设计再回过头来看做法是不是符合某种技术的特征;而是应该先分析需求,然后为了更科学地实现需求,根据不同技术的特征来选择其中最合适的来实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   920 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:50 · PVG 04:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.