P73 HTTP 与 RPC 的区别
面试题:HTTP 和 RPC 有什么区别?微服务里什么时候用 HTTP,什么时候用 RPC?
1. 概念
- HTTP:应用层协议,基于请求/响应模型,标准通用(文本/JSON),跨语言、跨平台;
- RPC(Remote Procedure Call):远程过程调用框架(Dubbo、gRPC、Thrift),核心是"像调本地方法一样调远程服务",底层可用 TCP/HTTP/自定义协议。
2. 对比
| 对比项 | HTTP(RESTful) | RPC |
|---|---|---|
| 协议 | HTTP 标准协议 | 自定义协议(可基于 TCP/HTTP2) |
| 数据格式 | JSON/XML(可读性好) | 二进制(Protobuf/Thrift,紧凑高效) |
| 性能 | 文本解析开销大 | 二进制序列化 + 长连接,性能更高 |
| 接口定义 | URL + 方法约定,无强契约 | IDL 强契约(接口/参数/返回固定) |
| 服务治理 | 一般靠网关/注册中心自己搞 | 框架内置:注册发现、负载均衡、重试、限流 |
| 跨语言 | 天然跨语言 | 需要 IDL 生成各语言代码 |
| 适用 | 对外接口、前后端、异构系统 | 内部微服务间高频调用 |
3. 微服务里怎么选
用 HTTP/REST
- 对外提供 API(第三方、前端);
- 跨语言/跨团队边界明确;
- 系统简单,不想引入 RPC 框架。
用 RPC(Dubbo/gRPC)
- 内部服务间高频、低延迟调用;
- 需要服务治理(注册发现、负载均衡、熔断);
- 大流量的核心链路(性能敏感)。
4. 加分点
- 说清"HTTP 和 RPC 不是对立的":gRPC 底层就基于 HTTP/2,很多 RPC 框架也走 HTTP;
- 提到 REST 的语义(资源、动词)和 RPC 的调用语义(方法)是设计哲学差异;
- 追问"Dubbo 和 SpringCloud 怎么选":SpringCloud 默认 HTTP(OpenFeign),Dubbo 是二进制 RPC,性能和服务治理侧重点不同;
- 补充:现在也有"HTTP/2 + Protobuf"融合方案(gRPC),兼顾可读性与性能。
一句话总结
HTTP 是通用应用层协议(文本、跨语言、适合对外),RPC 是"远程像本地"的调用框架(二进制高效、强契约、内置服务治理,适合内部高频调用);微服务内部重性能用 RPC,对外边界用 HTTP。