913 字
约 3 分钟
10
S17-B03 · 服务调用:RPC、负载均衡与 Dubbo

适用读者:用过 Feign/Dubbo 但不知道"像调本地方法"背后发生了什么的人。
前置:S17-B02、S04-J04(动态代理)。
覆盖旧文:1051(83) 1052(90) 1055(85) 912(78) 479(41) 1047(92) 1048(43) + Dubbo 六卡 = 1,020 点。
覆盖扩展:E-S17-013(RPC 的四个环节)。
上一篇:S17-B02 · 服务注册与发现
下一篇:S17-B04 · 网关。


1. 一句话结论

RPC 的"像本地调用"是假的:背后一定有"代理 → 序列化 → 网络 → 反序列化 → 反射调用"五步,每一步都可能失败或变慢。

调用方 method() → 动态代理 → 序列化 → 网络 → 反序列化 → 提供方反射调用

这与 S04-B05 的"动态代理"、S04-J04 的"反射"完全同源——RPC 框架只是把这几块拼起来。


2. 五个环节(E-S17-013)

环节 关键决策 影响
代理 JDK 动态代理/字节码生成 调用开销
序列化 JSON/Hessian/Protobuf 体积与兼容性
协议 HTTP/Dubbo/TCP 跨语言与性能
负载均衡 随机/轮询/一致性哈希/最少活跃 分布均匀度
容错 重试/熔断/降级 雪崩防控

判据:"要跨语言吗?" 要 → HTTP + Protobuf/JSON;不跨 → 私有协议(Dubbo)性能更好。


3. 序列化的取舍(A-1054)

方式 体积 跨语言 兼容性
JSON 大 ✅ 好
Hessian 中 ⚠️ 一般
Protobuf 小 ✅ 需 schema 演进纪律

S09(Go)的实测:Protobuf 比 JSON 小 2.51×(batch 场景)——这条在 RPC 场景同样成立。


4. 负载均衡:四种策略

策略 特点
随机 简单,量小时不均
轮询 均匀但不感知负载
最少活跃 感知处理能力(推荐)
一致性哈希 缓存亲和

"重试会不会放大故障":会——重试必须配熔断与限流(A01),否则故障时把流量翻倍打过去。


5. Dubbo 与 Feign 的差别(A-912)

维度 Dubbo Feign(Spring Cloud)
协议 私有 TCP(默认) HTTP
性能 高(二进制) 中
跨语言 较弱(生态) 强
服务发现 自带(可接 Nacos/ZK) 依赖注册中心
适用 Java 内部高并发 多语言/对外 API

判据:"内部服务且全 Java?" 是 → Dubbo;否则 → HTTP 系。


6. 五个误区

误区 真相
"RPC 和本地调用一样快" 有序列化与网络开销
"重试能提升成功率" 故障时会放大
"JSON 一定比 Protobuf 差" 跨语言/可读性更好
"Dubbo 一定比 Feign 好" 取决于是否跨语言
"负载均衡能解决不均" 需感知负载的策略

7. 自检

  1. RPC 的五个环节?
  2. 序列化的三个权衡维度?
  3. 四种负载均衡策略的差异?
  4. 为什么"重试要配熔断"?
  5. Dubbo 与 Feign 怎么选?

8. 下一篇

S17-B04 · 网关:统一入口与跨域

调用讲完,下一篇讲"外部流量怎么进来":网关与 Nginx 的分工。


本篇属于系列《S17 · 分布式与消息队列》。旧文来源:A-1051/1052/1055/912/479/1047/1048 + Dubbo 六卡;扩展点 E-S17-013。Protobuf 对比引用 S09 实测。

S17-B03 · 服务调用:RPC、负载均衡与 Dubbo
https://www.clxhxhhr.top/posts/5421/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。