阅读目标:
看完之后你能回答 5 个问题:
- RPC 是什么
- 为什么需要 RPC
- RPC 和 HTTP / DI 的区别
- RPC 为什么会慢
- 我现在需要学到什么程度
一、RPC 是什么?
RPC(Remote Procedure Call)= 远程过程调用
一句人话解释:
像调用本地方法一样,去调用另一台服务器上的方法。
本地方法调用(不是 RPC)
java
userService.getUser(1);
特点:
java
同一个应用
同一个 JVM
同一块内存
没有网络
速度极快。
RPC 调用(远程)
代码看起来一样:
java
userRpcService.getUser(1);
但实际发生:
java
参数打包
↓
网络发送
↓
远端执行
↓
返回结果
中间多了一整套 网络通信流程。
二、为什么会有 RPC?
因为系统不再是一个大项目,而是拆成多个服务:
java
用户服务
订单服务
支付服务
库存服务
积分服务
订单想查用户,就必须跨服务调用。
RPC 的出现,就是为了解决:
服务与服务之间如何通信。
三、RPC 在系统中的位置
java
浏览器 → HTTP → 网关 → 服务A
↓ RPC
服务B
↓ RPC
服务C
- HTTP:多用于 对外接口
- RPC:多用于 内部服务通信
四、RPC 为什么代码看起来像本地调用?
因为框架用了 代理模式。
你写的是:
java
UserService userService;
实际注入的是:
UserServiceProxy
代理对象在你调用时会:
- 序列化参数
- 发网络请求
- 等结果
- 反序列化返回
你以为是对象,其实是网络。
五、RPC 和 DI 的区别(扫盲重点)
很多人第一次学 RPC 都会产生错觉:
"这不就是依赖注入吗?"
写法确实像,但本质不同。
DI(依赖注入)
java
同一个应用
同一个 JVM
没有网络
流程:
java
Spring 创建对象 → 注入引用 → 直接执行
类比:
让隔壁同事递水。
RPC(远程调用)
java
不同应用
不同 JVM
有网络
流程:
java
代理拦截 → 序列化 → 网络 → 执行 → 返回
类比:
打电话叫外卖。
技术层面对比
| 维度 | DI | RPC |
|---|---|---|
| JVM | 同一个 | 不同 JVM |
| 网络 | 无 | 有 |
| 性能 | 极快 | 有延迟 |
| 序列化 | 否 | 是 |
| 失败概率 | 极低 | 需要考虑 |
| 超时/重试 | 不需要 | 必须考虑 |
六、RPC 框架是什么?
RPC 是一类框架,不是一个工具。
常见:
| 框架 | 背景 |
|---|---|
| Dubbo | 阿里 |
| gRPC | |
| Thrift | |
| OpenFeign | Spring 生态(HTTP 版 RPC) |
你不用造 RPC,只需要会用。
七、RPC 为什么可能慢?
因为它是 网络调用。
常见慢的原因:
1. 网络延迟
跨机房、丢包
2. 序列化慢
JSON 大对象
3. N+1 问题
循环调用 RPC
4. 下游服务慢
数据库慢、锁等待
5. 线程池打满
请求排队
八、RPC 的典型风险
| 风险 | 说明 |
|---|---|
| 超时 | 服务无响应 |
| 雪崩 | 下游挂了拖死上游 |
| N+1 | 循环调用 |
| 重试放大 | 一次变三次 |
| 线程阻塞 | QPS 上不去 |
九、工程师需要掌握到什么程度?
你现在不需要:
- 写 RPC 协议
- 写 Netty
- 写序列化框架
你需要:
java
知道是什么
知道什么时候用
知道什么时候慢
知道如何判断
十、最小脑图理解
java
RPC = 代理 + 序列化 + 网络 + 服务发现 + 负载均衡
十一、学习顺序建议
当前阶段优先级:
- SQL
- JVM
- 线程池
- Redis
- 接口设计
- RPC 使用
- 微服务治理
十二、终极一句话总结
RPC 是"假装本地调用"的远程网络调用。
写法像 DI,本质是网络。
你现在的目标不是造 RPC,
而是 会用、会判断、会优化。