从 TCP 到 RPC:彻底搞懂「HTTP 与 RPC用法区别」

简介: 本文深入剖析HTTP与RPC的本质区别,从TCP底层原理讲起,解析粘包拆包、协议封装等核心问题,梳理二者演进脉络。通过对比服务发现、传输性能、适用场景等维度,结合Dubbo、gRPC等框架,帮你按场景精准选型,彻底搞懂微服务通信的技术逻辑。

从 TCP 到 RPC:彻底搞懂「HTTP 与 RPC用法区别」

刚入行时,我曾一度困惑:HTTP 用得好好的,为啥微服务之间偏要选 RPC?直到顺着网络协议的演进脉络梳理下来,才发现这不是「替代关系」,而是「场景适配」的选择。今天就把这些知识点整合起来,用松散的节奏带你吃透 HTTP 与 RPC 的核心逻辑。


一、先搞懂底层:TCP 的特性与痛点

要理解 HTTP 和 RPC,得先从它们的「地基」—— TCP 说起。

TCP 是 70 年代就诞生的传输层协议,核心特性很明确:

  • 面向连接:通信前必须建立三次握手
  • 可靠传输:丢包会重传,保证数据完整
  • 基于字节流:数据像水流一样连续传输,没有天然边界

但「字节流无边界」恰恰是个大问题 —— 这就是 粘包 / 拆包 痛点。

举个生动的例子:

客户端发送了两句话:「夏洛特」和「特烦恼」,但 TCP 传输时可能会把它们拼成「夏洛特特烦恼」一起发,也可能拆成「夏洛」「特特烦恼」分开发。接收端根本不知道哪里是一句话的结束,哪里是另一句话的开始。

怎么解决?

答案是「自定义协议封装」:在 TCP 字节流之上,加上「消息头 + 消息体」的结构。比如用消息头里的「长度字段」告诉接收端:接下来多少字节是一个完整的消息。这也是 HTTP 和 RPC 协议的底层核心逻辑。


二、HTTP 与 RPC 的起源:谁先谁后?

很多人误以为 RPC 是「后起之秀」,其实恰恰相反:

  • 70 年代:TCP 诞生,提供底层传输能力
  • 80 年代:RPC 出现,解决「裸 TCP」的开发痛点(序列化、粘包、连接管理)
  • 90 年代:HTTP 流行,专为浏览器与 Web 服务器通信设计

所以问题本质不是「有了 HTTP 为什么要 RPC」,而是「有了 RPC 为什么要 HTTP」—— 因为 HTTP 更通用、更开放,适合跨平台、跨设备的公开通信。

它们的本质都是「基于 TCP 的应用层协议」,只是设计目标不同:

  • HTTP:面向「浏览器 + 公开服务」,追求通用、兼容、易理解
  • RPC:面向「内部服务 + 远程调用」,追求高效、性能、简洁

三、HTTP 与 RPC 的核心区别:一张表看明白

对比维度 HTTP RPC
服务发现 依赖 DNS 解析域名,默认 80/443 端口 依赖服务注册中心(Consul/Etcd/Nacos)或 CoreDNS
连接管理 HTTP/1.1 用 Keep-Alive 复用连接,高并发下有瓶颈 维护连接池,请求时取连接、用完放回,高效应对高并发
传输格式 文本格式(JSON/XML),Header 冗余多(User-Agent、Content-Type 等) 二进制格式(Protobuf/Thrift),Header 精简,无冗余
设计目标 兼容浏览器,需处理跨域、Cookie、302 跳转等场景 专注内部服务调用,无需兼容浏览器,只追求性能
开发成本 低,无需客户端 SDK,直接用 Postman 调试 中,需引入框架 SDK,生成客户端代码,但调用像本地方法

四、适用场景:没有好坏,只有适合

技术选型的核心是「匹配场景」,两者的分工很明确:

✅ 选 HTTP 的场景

  • 对外提供服务:比如前后端交互、给第三方开放 API
  • 需求简单,无需追求极致性能:比如管理后台的接口调用
  • 跨平台、跨设备通信:比如手机 App、小程序、网页都要调用的服务

✅ 选 RPC 的场景

  • 内部微服务通信:比如电商系统的「订单服务」调用「库存服务」
  • 高并发、低延迟需求:比如秒杀场景,需要快速响应
  • 多语言混合开发:比如 Java 服务调用 Go 服务,RPC 跨语言能力更强

五、补充知识点:让理解更完整

上面是核心逻辑,下面这些补充内容能帮你应对实际开发中的问题:

1. 常见的 RPC 实现框架(落地必备)

RPC 是一种「思想」,实际开发需要用具体框架:

  • Dubbo:阿里开源,Java 技术栈首选,支持多协议、多注册中心,生态成熟
  • gRPC:Google 开源,基于 HTTP/2 + Protobuf,跨语言能力极强(支持 Java/Go/Python 等 10+ 语言)
  • Thrift:Facebook 开源,支持多种序列化协议和传输方式,灵活度高
  • Spring Cloud OpenFeign:基于 HTTP 的 RPC 风格框架,兼顾开发效率和性能,适合 Spring 技术栈

2. HTTP 协议演进:正在缩小与 RPC 的性能差距

之前说 HTTP 性能不如 RPC,主要针对 HTTP/1.1。但 HTTP 也在进化:

  • HTTP/2:支持多路复用(一个连接并发处理多个请求)、头部压缩、二进制帧,性能提升 30%~50%,甚至成为 gRPC 的底层传输协议
  • HTTP/3:基于 QUIC(UDP + TLS),解决了 TCP 队头阻塞问题,性能更优,未来可能让 HTTP 和 RPC 的边界更模糊

3. RPC 的核心组件与完整调用流程

RPC 框架之所以好用,是因为封装了复杂的底层逻辑,核心组件包括:

  • 服务注册与发现:服务启动时注册地址,调用时查询地址
  • 序列化 / 反序列化:把对象转二进制(如 Protobuf),或反之
  • 网络传输:基于 TCP/HTTP/2 传输数据
  • 负载均衡:把请求分发到不同服务实例(轮询、加权轮询等)
  • 容错机制:超时重试、熔断、降级(避免服务雪崩)

完整调用流程(像调用本地方法一样简单):

  1. 客户端调用本地代理(Stub),比如 orderService.reduceStock()
  2. Stub 把参数序列化,通过网络发送给服务端
  3. 服务端代理(Skeleton)接收请求,反序列化参数,调用实际的 reduceStock() 方法
  4. 服务端把返回结果序列化,发送给客户端
  5. 客户端 Stub 反序列化结果,返回给调用者

4. 粘包 / 拆包的 3 种具体解决方法

之前提到「消息头 + 消息体」,这里补充常见方案:

  • 固定长度法:每个消息长度固定,不足的补空格(简单但浪费空间)
  • 分隔符法:用特殊字符(如换行符)分隔消息(需处理消息中包含分隔符的情况)
  • 消息头 + 消息体法:消息头包含消息长度(如 4 字节表示长度),这是 RPC 最常用的方式(如 Dubbo 协议)

5. 技术选型的具体决策依据

除了场景,还可以参考这几点:

  • 团队技术栈:Java 团队选 Dubbo,多语言团队选 gRPC
  • 性能要求:QPS 百万级选 RPC,十万级以下选 HTTP 足够
  • 开发效率:追求快速上线选 OpenFeign/HTTP,追求长期性能选 Dubbo/gRPC
  • 维护成本:HTTP 无需额外依赖,RPC 需维护注册中心、SDK 版本

总结:不用纠结,按场景选就对了

HTTP 和 RPC 不是「竞争对手」,而是「互补搭档」:

  • 对外通信、简单场景:用 HTTP,通用、省心
  • 内部微服务、高并发场景:用 RPC,高效、强大

搞懂它们的底层逻辑和场景差异,下次技术选型时就不会迷茫啦~

目录
相关文章
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
存储 自然语言处理 API
LlamaIndex使用指南
LlamaIndex是一个方便的工具,它充当自定义数据和大型语言模型(llm)(如GPT-4)之间的桥梁,大型语言模型模型功能强大,能够理解类似人类的文本。LlamaIndex都可以轻松地将数据与这些智能机器进行对话。这种桥梁建设使你的数据更易于访问,为更智能的应用程序和工作流铺平了道路。
6216 0
|
缓存 Java 应用服务中间件
Tomcat是如何打破"双亲委派"机制的?
上文我们详细了解了类加载以及什么是双亲委派机制,相信很多童鞋都了解Tomcat打破了双亲委派机制,本文将对Tomcat为什么要打破双亲委派机制,以及Tomcat是如何打破双亲委派机制的,进行完整性的复盘与解析。
4264 0
Tomcat是如何打破"双亲委派"机制的?
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:八十九、Encoder-only与Decoder-only模型架构:基于ModelScope小模型的实践解析
本文深入解析大模型两大主流架构:Encoder-only与Decoder-only。前者如BERT,擅长双向理解,适用于文本分类、情感分析等任务;后者如GPT,基于自回归生成,适用于内容创作、对话系统等场景。二者代表不同技术路径,分别聚焦“深度理解”与“持续生成”,是开发者选型的重要依据。
728 7
|
8月前
|
安全 应用服务中间件 Linux
HTTPS 优化完整方案解析
本文详解HTTPS性能优化全方案,从原理到实操,涵盖硬件加速(AES-NI)、软件升级(内核与OpenSSL)及协议层优化(TLS 1.3、ECDSA、会话复用等),配合Nginx配置模板与验证方法,助你实现安全与速度双提升,显著降低访问延迟。
1601 156
|
2月前
|
人工智能 Rust 安全
2026年Vibe Coding实战指南:从入门到精通全流程
《2026年Vibe Coding实战指南》聚焦AI辅助开发新范式,以Rust Actix-web+异步任务为实战场景,系统拆解意图驱动开发全流程:从理念认知、TRAE等工具选型、提示词工程、三段式代码生成(含BUG初版→修正版对比),到迭代优化与工程落地,助开发者高效掌握Vibe Coding核心能力。(239字)
|
3月前
|
存储 人工智能 运维
十大 AI Agent Memory记忆系统全维度横评 主流方案架构、性能与场景选型指南
随着AI Agent从基础问答工具进化为可执行复杂长周期任务的智能体,记忆能力已经成为决定智能体上限的核心要素。传统基于向量数据库与RAG检索的技术方案,仅能实现简单信息检索,并不具备完整的记忆管理能力,在时序追踪、多代理一致性、分层存储、智能路由等方面存在明显短板。在实际生产环境中,大量AI Agent将近八成以上的计算资源消耗在重复梳理上下文信息上,真正用于业务执行的资源占比极低,这也是当前智能体规模化落地的核心瓶颈。
1588 0
|
6月前
|
Java 关系型数据库 MySQL
DDD 领域驱动设计:从战略到战术,终结微服务拆分的所有混乱
本文深入剖析微服务拆分困境,指出问题根源在于混淆技术边界与业务边界。提出DDD(领域驱动设计)作为破局之道:以战略设计(领域划分、统一语言、事件风暴、上下文映射)确定微服务合理边界;以战术设计(四层架构、聚合根、值对象等)保障领域模型内聚。结合电商订单域完整落地示例,揭示DDD本质是“先懂业务,再写代码”的设计思想。
1038 4
|
8月前
|
数据采集 人工智能 Java
核心目标:构建Java全流程AI Agent
在AI深度赋能企业背景下,依托JBoltAI框架,打造贯穿业务全链路的全流程AI Agent。突破传统自动化局限,实现跨模块协同、多系统融合与自适应迭代,推动Java生态智能化升级。
724 5
|
7月前
|
安全 Linux iOS开发
IDA Pro 9.3 正式版发布 - 强大的反汇编程序、反编译器和多功能调试器
IDA Pro 9.3 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
14230 9
IDA Pro 9.3 正式版发布 - 强大的反汇编程序、反编译器和多功能调试器

热门文章

最新文章