RPC 是远程过程调用的缩写,核心是让程序像调用本地函数一样,调用远程服务器上的函数或服务,无需关注网络通信细节。
核心本质
- 屏蔽网络编程复杂性,简化分布式系统中服务间的调用流程。
- 底层基于网络传输(如 TCP、HTTP),但上层封装了序列化、寻址、容错等能力。
- 目标是 “透明化远程调用”,让开发者感知不到 “远程” 与 “本地” 的差异。
关键组成部分
- 客户端(调用方):发起远程调用请求,负责参数序列化、服务寻址。
- 服务端(被调用方):接收请求, deserial 参数,执行目标函数,返回结果。
- 序列化 / 反序列化:将参数、返回值转化为可网络传输的二进制 / 文本格式(如 Protobuf、JSON)。
- 通信协议:定义请求 / 响应的格式、传输规则(如 Dubbo 协议、gRPC 基于 HTTP/2)。
- 注册中心(可选):管理服务地址,帮助客户端找到服务端(如 Nacos、Eureka)。
典型调用流程
- 客户端调用本地封装的 “代理函数”,传入参数。
- 代理函数将参数序列化,通过通信协议发送给服务端。
- 服务端接收请求, deserial 参数,调用实际业务函数。
- 服务端将执行结果序列化,返回给客户端。
- 客户端 deserial 结果,返回给调用者,完成流程。
常见应用场景
- 分布式系统中跨服务调用(如订单服务调用支付服务、用户服务)。
- 微服务架构下的服务间通信(如 Spring Cloud 集成 Feign、Dubbo 框架)。
- 跨语言调用(如 Java 服务调用 Python 服务,通过 gRPC 等跨语言协议实现)。
RPC 核心概念与主流框架对比表
| 对比维度 | Dubbo | gRPC | Feign |
|---|
| 核心定位 | 高性能 Java 微服务 RPC 框架 | 跨语言、高性能的 RPC 框架(基于 HTTP/2) | 声明式 REST 客户端(Spring Cloud 生态) |
| 通信协议 | 自定义 Dubbo 协议(默认)、支持 HTTP/2、gRPC 等 | 基于 HTTP/2 | 基于 HTTP/1.1(REST 协议) |
| 序列化方式 | 支持 Hessian2、Protobuf、JSON 等 | 默认 Protobuf(高效二进制序列化) | 支持 Jackson、Gson 等(JSON 为主) |
| 跨语言支持 | 有限(主要支持 Java,第三方扩展支持 Go、Python 等) | 原生支持多语言(Java、Go、Python、C++ 等) | 依赖 HTTP 协议,理论支持跨语言(需适配 REST 接口) |
| 生态依赖 | 可独立使用,也可集成 Spring Cloud、Nacos 等 | 无强生态依赖,可灵活集成各类注册中心、配置中心 | 强依赖 Spring Cloud 生态(如 Eureka、Nacos、Ribbon) |
| 性能表现 | 高性能(二进制协议 + 长连接,适合高并发场景) | 高性能(HTTP/2 多路复用 + Protobuf,跨语言场景下优势明显) | 性能中等(HTTP/1.1 无多路复用,适合轻量级调用) |
| 适用场景 | Java 微服务架构、高并发内部服务调用、需要极致性能的场景 | 跨语言服务调用、多语言协同开发、需要 HTTP/2 特性的场景 | Spring Cloud 生态项目、REST 风格接口调用、快速开发轻量级服务 |
| 关键特性 | 服务注册发现、负载均衡、熔断降级、服务治理能力完善 | 流式调用、双向通信、metadata 传递、内置健康检查 | 声明式接口(注解驱动)、自动负载均衡、与 Spring 无缝集成 |
技术选型建议
- 若为 Java 纯技术栈,追求高性能和完善的服务治理,选 Dubbo。
- 若涉及多语言协同(如 Java 调用 Go/Python),或需要流式通信,选 gRPC。
- 若已使用 Spring Cloud 生态,追求开发效率和 REST 接口的简洁性,选 Feign。
RPC 框架快速选型决策表
| 决策维度 | 选型结论 | 核心依据 |
|---|
| 技术栈 | 纯 Java 技术栈 | 优先选 Dubbo,服务治理成熟且性能适配 Java 生态 |
| 多语言协同(Java/Go/Python/C++ 等) | 必选 gRPC,原生跨语言支持 + 高性能无替代 |
| 已接入 Spring Cloud 生态 | 直接选 Feign,零成本集成 + 注解式开发高效 |
| 业务并发量 | 高并发(QPS 10 万 +) | 选 Dubbo 或 gRPC,二进制协议 + 长连接 / 多路复用支撑高吞吐 |
| 中低并发(QPS 1 万以下) | 选 Feign,开发效率优先,无需过度追求极致性能 |
| 接口通信风格 | 内部服务紧密调用(无跨语言需求) | 选 Dubbo,自定义协议适配性更强 |
| 跨团队 / 跨系统 REST 风格接口 | 选 Feign,REST 接口通用性强,对接成本低 |
| 需流式通信(如文件传输、实时数据流) | 选 gRPC,HTTP/2 流式特性天然适配 |
| 服务治理需求 | 需完善熔断 / 降级 / 监控 / 灰度发布 | 选 Dubbo,服务治理能力开箱即用 |
| 仅需基础注册发现,无复杂治理需求 | gRPC 或 Feign 均可,按技术栈适配 |
| 开发效率优先级 | 优先快速落地(短周期项目) | 选 Feign(Spring 注解直达)或 Dubbo(轻量化配置) |
| 可接受一定学习成本,追求长期性能 | 选 gRPC(跨语言)或 Dubbo(Java 生态) |
极简选型口诀
- 纯 Java + 高并发 + 强治理 → Dubbo
- 多语言 + 流式通信 → gRPC
- Spring Cloud + REST + 快开发 → Feign