← 返回软件技术总览 软件技术 · 知识点深化 · RPC 与注册中心:从 HTTP 调用到服务发现
软件技术 · 知识点深化 · 分布式系统

RPC 与注册中心:从 HTTP 调用到服务发现

微服务之间怎么调用?HTTP 也能调,但 RPC 框架帮你做了序列化、网络通信、服务发现、负载均衡。这一页讲透 RPC 调用流程、注册中心角色、负载均衡策略,理解 Dubbo/gRPC 在干什么。

① 怎么学(4 步走,约 65 分钟)

先建立直觉再抠细节,按这四步走最稳:

1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 说出 RPC 调用流程;② 解释注册中心作用;③ 对比负载均衡策略;④ 区分 HTTP 与 RPC。

② 一图看懂:RPC 调用全景

RPC 客户端 Stub 代理接口序列化 注册中心 服务列表注册发现 网络通信 TCP/HTTP2 传输 服务端 Stub 反序列化调本地 应用:微服务互调 Dubbo/gRPC 易错:注册中心挂了影响调用 本地缓存列表兜底
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。

③ 本质直觉:RPC 就是"假装本地调用"

你写 userService.get(1),看起来像调本地方法,实际可能是跨网络调到另一台机器。RPC 框架帮你把这件事藏起来。

流程:客户端调本地接口 → Stub 把方法名和参数序列化 → 通过网络发给服务端 → 服务端 Stub 反序列化 → 调真正实现 → 结果序列化返回 → 客户端 Stub 反序列化返回给调用方。

注册中心:服务启动时把自己的 IP 注册到 Nacos;调用方从注册中心拿到可用服务列表,本地负载均衡选一台。注册中心挂了,客户端用本地缓存的列表还能继续调。

为什么不用 HTTP:HTTP 文本协议开销大、连接建立慢;RPC 用 TCP 长连接 + 二进制序列化(Protobuf),性能高很多。

服务AStub代理 注册中心 服务B真实实现 TCP序列化 注册中心只做目录,不参与实际调用
注册中心高可用注册中心本身要集群部署。即使它挂了,客户端本地缓存的服务列表仍可调用,只是新实例上下线感知不到。

④ 完整知识体系

负载均衡策略

策略原理适用
随机随机选一台服务均匀
轮询按顺序轮简单
加权轮询按性能权重分配机器性能不均
一致性哈希同一请求落同一台有状态会话
最小活跃选当前请求最少的慢节点自动少接
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 解决什么问题?
让远程调用像本地调用。
基础2注册中心作用?
服务注册发现。
基础3常见负载均衡策略?
轮询、随机、加权、一致性哈希。
基础4RPC 用什么连接?
TCP 长连接。
基础5序列化内部用什么?
Protobuf/Hessian。
基础6RPC 要设超时吗?
必须,防级联故障。

▍中档 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 天合书口述注册中心作用不看资料

← 返回软件技术总览