找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2345

积分

0

好友

327

主题
发表于 17 小时前 | 查看: 2| 回复: 0

很长时间以来,许多开发者可能都没有深入思考过 RPC(Remote Procedure Call,远程过程调用)和 HTTP 调用的本质区别——不都是在服务端写个接口,然后在客户端调用么?本文将从网络协议、架构设计和应用场景等角度,为你厘清两者的差异。

首先,从最根本的协议层来看,RPC 框架通常基于 TCP/IP 协议构建,而常见的 HTTP 服务则基于 HTTP 协议。HTTP 协议本身位于 TCP/IP 协议栈的应用层,其下是作为传输层的 TCP。因此,单从协议栈的“简洁性”和网络开销来看,直接基于传输层的 RPC 在效率上往往更具优势。为了更清晰地理解这一点,我们有必要回顾一下网络分层模型。

OSI 网络七层模型

虽然在实践中我们更多使用 TCP/IP 五层模型,但了解经典的 OSI 七层模型有助于我们从原理上把握不同协议的位置与职责。

OSI七层模型结构图

该模型从上到下分为:

  • 第一层:应用层。 为应用程序提供网络通信接口。
  • 第二层:表示层。 负责数据格式转换、编码解码及加密解密。
  • 第三层:会话层。 负责建立、管理和终止应用程序之间的会话。
  • 第四层:传输层。 提供端到端的可靠或不可靠数据传输服务。
  • 第五层:网络层。 负责逻辑寻址和路由选择,将数据包从源主机传送到目的主机。
  • 第六层:数据链路层。 在物理链路上提供可靠的数据传输,将网络层的数据包封装成帧。
  • 第七层:物理层。 定义物理介质的特性,传输原始的比特流。

TCP/IP协议栈分层详图

在实际的 TCP/IP 五层协议结构中,表示层和会话层的功能通常被合并到了应用层。我们的关注焦点应放在 应用层(如HTTP)传输层(如TCP)。理解了网络分层,我们就能更好地剖析 RPC 服务的独特之处。

RPC 服务详解

我们可以从架构、调用方式和主流框架三个维度来认识 RPC。

RPC 架构

一个典型的 RPC 架构包含四个核心组件:Client(客户端)、Server(服务端)、Client Stub(客户端存根)和 Server Stub(服务端存根)。

RPC客户端与服务端通信模型

  • 客户端(Client):服务的调用方。
  • 服务端(Server):真实服务逻辑的提供者。
  • 客户端存根(Client Stub):存放服务端地址信息,将客户端的调用请求参数序列化、打包成网络消息,并发送给服务端。
  • 服务端存根(Server Stub):接收客户端网络消息,将其反序列化、解包,并调用本地的实际服务方法,然后将结果打包返回。

RPC 在大型企业内部系统中尤为常见。系统繁多、业务复杂,对通信效率要求极高,此时 RPC 的优势得以凸显。在实际的 Java 项目开发中,通常会使用 Maven 进行依赖管理。例如,一个订单处理系统会将其所有服务接口定义在一个独立的 JAR 包中。服务提供方引入该 JAR 并实现接口,服务调用方也仅需引入同一个 JAR 包即可进行调用。这样做的主要目的是减少客户端依赖的臃肿,提升部署效率,同时实现客户端与服务端的解耦,增强代码的可移植性。

同步调用与异步调用

RPC 支持灵活的调用模式:

  • 同步调用:客户端发起调用后,会阻塞等待直到服务端返回结果。
  • 异步调用:客户端发起调用后立即返回,不等待结果,后续通过回调(Callback)或 Future 等机制获取结果通知。如果客户端完全不关心结果,甚至可以发起单向(Oneway)调用。

这类似于 Java 中的 RunnableCallable 接口。使用 Runnable 执行异步任务时我们不关心返回值;而使用 Callable 配合 Future,则可以在需要时获取异步执行的结果。

流行的 RPC 框架

目前主流的开源 RPC 框架选择多样:

  1. gRPC:由 Google 开源,基于 HTTP/2.0 协议,支持多种编程语言。HTTP/2.0 的多路复用、头部压缩等特性赋予了它高性能。其底层通常由 Netty 网络框架提供支持。
  2. Thrift:由 Facebook 开源,是一个跨语言的 RPC 服务开发框架。它通过 IDL(接口定义语言)定义服务,并由代码生成器自动生成多语言的服务端和客户端骨架代码,开发者只需关注业务逻辑实现。
  3. Dubbo:阿里巴巴开源的知名 RPC 框架,在国内互联网企业广泛应用。其特点是高度可扩展,协议和序列化方式均可插拔。服务接口基于 Java Interface 定义,能与 Spring 框架无缝集成,易于开发部署,其架构理念与当下流行的微服务一致。

HTTP 服务

在早期或中小型项目中,基于 HTTP 协议的 RESTful API 是系统间交互的主流方式。其优点非常突出:简单、直接、开发便捷,利用无处不在的 HTTP 协议即可完成数据传输。

例如,一个典型的 HTTP 接口调用如下:

POST http://api.example.com/v1/order/create

客户端会收到一个 JSON 或 XML 格式的响应,然后进行解析处理。对于接口数量有限、交互逻辑不复杂的场景,这种方式开发迭代速度很快。

然而,在大型企业复杂的微服务架构下,内部子系统众多,服务接口调用频繁,RPC 框架的诸多特性便显示出巨大价值。首先,RPC 框架通常支持长连接,避免了 HTTP 短连接每次通信所需的 TCP 三次握手开销,显著降低了网络延迟。其次,成熟的 RPC 框架往往配套有服务注册与发现中心,提供服务治理能力,如接口的发布、下线、动态扩展、负载均衡和丰富的监控管理,这些对于服务调用方而言是无感知的、统一化的操作,极大提升了分布式系统的可维护性。

总结

RPC 服务和 HTTP 服务各有其适用的土壤。简单来说:

  • RPC 更侧重于性能、效率和服务治理,适用于大型、复杂的分布式系统内部通信。
  • HTTP(RESTful API)更侧重于简单性、通用性和易用性,适用于对外提供开放 API 或内部快速迭代的中小型项目。

技术选型不应盲目追随潮流。关键在于对项目进行全面的评估,仔细权衡两种通信方式在性能、开发效率、维护成本和团队技能等方面的影响,从而选择最适合当前项目阶段和未来发展的方案。切勿为了使用 RPC 而使用 RPC,因地制宜才是明智之举。

希望这篇对比能帮助你更好地理解 RPC 与 HTTP。如果你想与更多开发者交流此类架构设计话题,欢迎访问云栈社区参与讨论。




上一篇:firewalld与iptables对比实战:2025年Linux运维防火墙选型指南
下一篇:深入解析Flink Mailbox线程模型:源码实现与执行流程详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-16 20:00 , Processed in 0.326658 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表