软件技术 · 知识点深化 · 分布式系统
RPC 与注册中心:从 HTTP 调用到服务发现
微服务之间怎么调用?HTTP 也能调,但 RPC 框架帮你做了序列化、网络通信、服务发现、负载均衡。这一页讲透 RPC 调用流程、注册中心角色、负载均衡策略,理解 Dubbo/gRPC 在干什么。
① 怎么学(4 步走,约 65 分钟)
先建立直觉再抠细节,按这四步走最稳:
1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 说出 RPC 调用流程;② 解释注册中心作用;③ 对比负载均衡策略;④ 区分 HTTP 与 RPC。
② 一图看懂:RPC 调用全景
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。
③ 本质直觉:RPC 就是"假装本地调用"
你写 userService.get(1),看起来像调本地方法,实际可能是跨网络调到另一台机器。RPC 框架帮你把这件事藏起来。
流程:客户端调本地接口 → Stub 把方法名和参数序列化 → 通过网络发给服务端 → 服务端 Stub 反序列化 → 调真正实现 → 结果序列化返回 → 客户端 Stub 反序列化返回给调用方。
注册中心:服务启动时把自己的 IP 注册到 Nacos;调用方从注册中心拿到可用服务列表,本地负载均衡选一台。注册中心挂了,客户端用本地缓存的列表还能继续调。
为什么不用 HTTP:HTTP 文本协议开销大、连接建立慢;RPC 用 TCP 长连接 + 二进制序列化(Protobuf),性能高很多。
注册中心高可用注册中心本身要集群部署。即使它挂了,客户端本地缓存的服务列表仍可调用,只是新实例上下线感知不到。
④ 完整知识体系
负载均衡策略
| 策略 | 原理 | 适用 |
| 随机 | 随机选一台 | 服务均匀 |
| 轮询 | 按顺序轮 | 简单 |
| 加权轮询 | 按性能权重分配 | 机器性能不均 |
| 一致性哈希 | 同一请求落同一台 | 有状态会话 |
| 最小活跃 | 选当前请求最少的 | 慢节点自动少接 |
RPC 调用链路client stub -> 序列化 -> 网络 -> server stub -> 本地调用 -> 序列化 -> 网络 -> 反序列化
序列化选型Protobuf 跨语言性能好;Hessian Java 生态;JSON 可读但慢
Dubbo vs gRPC
Dubbo 国内生态,TCP + Hessian2,注册中心 Nacos/ZK。gRPC 跨语言,HTTP2 + Protobuf,适合多语言微服务。
⑤ 应用场景与例题
例1 服务A调服务B,注册中心起什么作用?
A 怎么知道 B 在哪?
B 启动时把 IP:端口注册到 Nacos。A 从 Nacos 拉到 B 的实例列表,本地负载均衡选一个,建立连接调用。
例2 注册中心宕机影响调用吗?
不影响实际调用。客户端本地缓存了服务列表,继续调。只是新实例上线/下线感知不到。
例3 为什么 RPC 比 HTTP 快?
TCP 长连接避免三次握手;二进制 Protobuf 比 JSON 小;连接复用。HTTP/1.1 短连接开销大。
做题心法RPC = 本地方法调用的外观 + 网络通信 + 服务发现。
⑥ 高频错误诊断(4 条)
错误1:以为注册中心参与每次调用注册中心只做目录,调用是点对点。
错误2:序列化选 JSON 做内部 RPC性能差体积大,内部用 Protobuf/Hessian。
错误3:不做负载均衡写死 IP,扩容无法生效。
错误4:同步 RPC 等太久要设超时时间,避免级联故障。
⑦ 考点真题演练(5 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 流程 | 问 RPC 步骤 | Stub+序列化+网络 |
| 注册中心 | 问挂了怎样 | 本地缓存仍可调 |
| 负载均衡 | 问策略 | 轮询/随机/一致性哈希 |
| 序列化 | 问内部用什么 | Protobuf/Hessian |
真题basic1. RPC 中注册中心的作用是?
真题mid2. 注册中心宕机后,已建立的调用?
真题mid3. 以下哪个不是负载均衡策略?
真题hard4. 内部微服务 RPC 推荐序列化?
真题hard5. 一致性哈希适合什么场景?
⑧ 必背知识点卡
本质:假装本地调用,实际跨网络
流程:Stub 序列化 -> 网络 -> 反序列化调本地
注册中心:服务目录,不参与调用 挂了本地缓存
负载均衡:轮询/随机/加权/一致性哈希
序列化:Protobuf/Hessian 别用 JSON
超时:RPC 必须设超时 防级联故障
Dubbo/gRPC:国内 Dubbo,跨语言 gRPC
⑨ 动手输出:解释一次 RPC 调用发生了什么
场景:面试问"你说下 RPC 调用过程"。
① 客户端:调本地接口,Stub 代理拦截。
② 序列化:方法名+参数编码成字节流。
③ 网络:通过 TCP 长连接发到服务端。
④ 服务端:Stub 反序列化,调真正实现。
⑤ 返回:结果原路返回,客户端 Stub 解码。
口述思路注册中心只给地址,调用是点对点长连接。
⑩ 分层练习(基础 + 中档 + 拔高)
▍基础 6 题
基础1RPC 解决什么问题?
让远程调用像本地调用。
基础3常见负载均衡策略?
轮询、随机、加权、一致性哈希。
基础5序列化内部用什么?
Protobuf/Hessian。
▍中档 5 题
中档1为什么注册中心挂了还能调用?
客户端本地缓存了服务列表。
中档2Dubbo 和 gRPC 区别?
Dubbo 国内 TCP+Hessian;gRPC 跨语言 HTTP2+Protobuf。
中档3一致性哈希解决什么?
节点扩缩时缓存尽量不失效。
中档4为什么 RPC 比 HTTP 快?
长连接+二进制序列化。
中档5Stub 是什么?
客户端/服务端的代理层,做序列化。
▍拔高 5 题
拔高1服务发现流程?
服务启动注册 -> 消费者订阅 -> 收到列表变更推送。
拔高2怎么处理服务端宕机?
客户端失败重试+剔除故障节点。
拔高3加权轮询怎么算?
按权重分配比例,性能好的多接。
拔高4IDL 是什么?
接口定义语言,如 Protobuf 写服务契约。
拔高5RPC 怎么做熔断?
结合 Sentinel/Hystrix,失败率高时快速失败。
⑪ 记忆口诀 + 7 天复习计划
三句口诀① 本地外观远程调,Stub 序列化网络跑。② 注册中心只给目录,挂了缓存还能调。③ 长连接二进制,超时熔断不能少。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画 RPC 流程图 | 五步说清 |
| 第 2 天 | 背负载均衡表 + 基础 6 题 | 策略记住 |
| 第 3 天 | 做中档 5 题,对比 Dubbo/gRPC | 区别说清 |
| 第 4 天 | 做拔高 5 题,写服务发现流程 | 步骤对 |
| 第 5 天 | 做⑦真题 5 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合书口述注册中心作用 | 不看资料 |
← 返回软件技术总览