V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hsymlg
V2EX  ›  程序员

问个概念问题,服务之间 feign 调用 算不算 rpc

  •  
  •   hsymlg · 2023-02-19 11:25:59 +08:00 · 4640 次点击
    这是一个创建于 678 天前的主题,其中的信息可能已经有所发展或是发生改变。
    29 条回复    2023-02-20 16:35:53 +08:00
    echoless
        1
    echoless  
       2023-02-19 11:27:57 +08:00 via Android
    gRPC
    hsymlg
        2
    hsymlg  
    OP
       2023-02-19 11:33:19 +08:00
    @wuhaoecho 因为 gRPC 是 rpc 框架,所以 feign 也是?
    Red998
        3
    Red998  
       2023-02-19 11:35:45 +08:00   ❤️ 1
    算 rpc 是一个概念、http 也算是一种 rpc
    jorneyr
        4
    jorneyr  
       2023-02-19 11:39:31 +08:00
    不算
    chanchan
        5
    chanchan  
       2023-02-19 12:47:43 +08:00
    我觉得 rpc 就不应该有这么多讨论,一个程序通过网络调用另一个程序得到结果,就叫 rpc
    tt67wq
        6
    tt67wq  
       2023-02-19 13:05:09 +08:00
    不叫 rpc 叫啥?
    OldCarMan
        7
    OldCarMan  
       2023-02-19 13:56:27 +08:00
    rpc 只是个概念,feign,grpc,thrift 等你可以理解都是 RPC 的一个个实例,只是他们所支持的序列化方式 /通信协议,特性或功能,想达成的目的等可能不一样而已。
    hsymlg
        8
    hsymlg  
    OP
       2023-02-19 14:12:48 +08:00   ❤️ 1
    @OldCarMan https://zh.wikipedia.org/wiki/%E9%81%A0%E7%A8%8B%E9%81%8E%E7%A8%8B%E8%AA%BF%E7%94%A8
    这是 wiki 的中文版,上来第一句话就是 rpc 是个计算机通信协议,我 google 半天也不知道协议内容在哪里。如果只是字面意思的概念的话,那服务之间 feign 调用确实算得上 remote procedure call
    OldCarMan
        9
    OldCarMan  
       2023-02-19 14:29:18 +08:00
    zachlhb
        10
    zachlhb  
       2023-02-19 15:27:43 +08:00
    Feign 是一种用于创建基于 HTTP 的客户端的框架,通常用于通过 REST API 进行服务之间的调用。虽然它使用了网络协议,但它不是 RPC ( Remote Procedure Call ,远程过程调用)。

    RPC 是一种协议,它允许在不同进程或网络中的计算机之间进行远程调用。它的目的是使分布式系统中的应用程序能够像本地调用一样访问服务。RPC 通常使用编码的二进制协议进行通信,而 Feign 则使用基于 HTTP 的 REST API 进行通信。

    因此,虽然 Feign 可以用于服务之间的调用,但它不是 RPC 。
    hsymlg
        11
    hsymlg  
    OP
       2023-02-19 15:38:15 +08:00
    @zachlhb “Feign 则使用基于 HTTP 的 REST API 进行通信”,基于 HTTP 的 REST API 进行通信是 Feign 不属于 rpc 的原因?
    Ericcccccccc
        12
    Ericcccccccc  
       2023-02-19 16:00:14 +08:00
    经典问题, http 是不是 rpc?
    rrfeng
        13
    rrfeng  
       2023-02-19 16:01:25 +08:00 via Android
    http 和 rpc 不在一个维度。
    ql562482472
        14
    ql562482472  
       2023-02-19 16:24:11 +08:00
    alexleee
        15
    alexleee  
       2023-02-19 20:19:59 +08:00
    认为 http 不算 rpc 的朋友可以陈述下观点吗,谢谢了
    lrvinye
        16
    lrvinye  
       2023-02-19 21:41:25 +08:00
    举个例子来类比下:
    http: 普通人都听得懂的官方语言(普通话、英语)
    rpc:行业内(圈子内)约定黑话(方言、气象报文...)
    cnxobo
        17
    cnxobo  
       2023-02-19 21:41:44 +08:00
    Feign 调用属于远程过程调用(RPC)的一种。RPC 是指通过网络实现不同进程或不同机器之间相互调用的过程,包括远程调用、远程方法调用、远程过程调用等。在微服务架构中,服务之间通过 RPC 进行通信是非常常见的做法,而 Feign 就是一种优雅的 RPC 调用方式,它允许开发人员使用简单的接口描述来定义服务之间的调用,隐藏了底层的通信细节,方便开发人员进行调用和维护。因此,可以说服务之间的 Feign 调用是 RPC 的一种实现方式。
    lambdaq
        18
    lambdaq  
       2023-02-19 21:49:15 +08:00
    如果拿来调用得到返回,那么就是 rpc 。比如拿来传输文件,那么就不是 rpc 。
    hidemyself
        19
    hidemyself  
       2023-02-19 22:03:50 +08:00
    算啊,fegin 算 rpc 的一种实现
    mercurius
        20
    mercurius  
       2023-02-19 22:04:58 +08:00
    Feign 底层实际上是 HTTP 请求的封装实现
    RPC 本质上不算是协议,而是一种调用方式,并且 HTTP 协议只是 RPC 的一种实现
    a22271001
        21
    a22271001  
       2023-02-19 22:23:45 +08:00   ❤️ 1
    @zachlhb ChatGPT ?
    dcsuibian
        22
    dcsuibian  
       2023-02-19 22:32:47 +08:00
    个人觉得吧,可以算是
    毕竟普通的 http 请求也确实可以算是把参数传过去,把结果传回来,跟调函数一样

    但大部分时候,如果说 rpc 框架,更多地是想强调“在调一个远程的服务时,代码方面表现地像在调用一个本地的函数一样”,就像 grpc 做的
    而如果是普通的 http ,你可能还得考虑 get/put/post/delete ,content-type ,以及需要显式地注意 request 、response 等概念

    所以我也觉得这东西应该不需要过度讨论
    wangxiaoaer
        23
    wangxiaoaer  
       2023-02-19 22:39:44 +08:00
    广义的 RPC 包含 HTTP 。

    狭义的 RPC 指的是本地调用(函数)背后是通过调用远程服务实现,这个调用方式可以是 HTTP ,也可以是 TCP 、UDP 。
    xy90321
        24
    xy90321  
       2023-02-19 22:42:39 +08:00 via iPhone
    rpc 的精髓是远程服务的本地化调用,应该用起来像本地函数调用一样丝滑(不是指处理执行、响应的速度,而是单纯指调用方式)

    用现成框架 /实现也好,你自己通过各种包装造轮子也好,只要能实现让调用端仿佛是在调用一个本地处理 /函数一样,那就是 rpc
    wm5d8b
        25
    wm5d8b  
       2023-02-20 08:18:18 +08:00 via Android
    @a22271001 当前阶段的 ai ,看来还是可以区分的,毕竟没有情感
    jinliming2
        26
    jinliming2  
       2023-02-20 09:34:25 +08:00 via iPhone
    @alexleee #15 我觉得 HTTP 不算的原因是,HTTP 只是一个传输协议,在这个概念上可以看作是和 TCP 一个层面的东西,它本身不能算 RPC 。(注:不是按 OSI 模型去划分的
    而 RPC 字面意思就是调用远程的函数就像调用本地的函数一样,那么至少得有一个“调用本地函数”这样一个动作。
    所以,一个算是 传输层 的概念,一个算是 表示层 /应用层 的概念。
    所以,我觉得可以基于 HTTP 这个协议来封装成 RPC ,比如写一堆 function ,然后内容就是 fetch xxx ,这可以算作是 RPC 。但至于这个 fetch 下面是 HTTP 还是 TCP UDP ,甚至你愿意的话用 ICMP ping 来传输都没啥问题。
    比如 gRPC Web 也是基于 HTTP 的,但重点强调的不是基于 HTTP 传输,而是传输的内容是经过编码的“函数调用”,使用者就像调用本地函数一样。
    mmmmeme
        27
    mmmmeme  
       2023-02-20 10:02:05 +08:00
    @zachlhb ChatRPC ?
    xlzyxxn
        28
    xlzyxxn  
       2023-02-20 11:31:37 +08:00
    RPC 比 HTTP 要年老,因为 web 和浏览器通用的需求,需要一个通用的协议;可以说 PRC 是个调用方式,HTTP 是他的其中一个实现方式;因为用的人太多了,也可以把他两放到一块做对比(服务发现、底层连接协议、序列化协议等等);最后,用一个表情包说说我的观点:嗯......怎么不算呢
    cpszgy
        29
    cpszgy  
       2023-02-20 16:35:53 +08:00
    一个 RPC 的要素,协议商定,序列化,反序列化,过程调用,结果返回。feign 的工具包实现了这一过程的客户端功能。当然他欠缺了一点服务端的能力。因为服务端的使用了标准的的 http 协议。所以我感觉算是一个基于 http 协议的 rpc 客户端。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.