1. 一次 RPC 调用的完整过程?(手撕链路)

RPC = 像调用本地方法一样调用远程方法。核心链路:

  1. 客户端代理:调用方持有一个"接口的动态代理"(看似本地实现)
  2. 参数序列化:代理把方法名 + 参数对象序列化成字节流
  3. 网络传输:按协议(长度头 + 数据)发送到服务端(TCP/Netty)
  4. 服务端反序列化 + 找到实现类(路由分发)
  5. 执行方法 → 结果序列化返回
  6. 客户端反序列化 → 返回给调用方(同步等待或异步回调)
RPC 与 HTTP 调用的对比
HTTP(REST):
  - 面向资源,语义化 URL,可读可调试(浏览器/curl)
  - 基于 HTTP 协议(请求头重、JSON 文本序列化大)
  - 适合:对外接口、跨语言、低延迟要求不极端

RPC:
  - 面向方法,接口即契约,传输高效(二进制序列化+长连接)
  - 自带注册发现/负载均衡/超时重试等治理能力
  - 适合:微服务内部高频调用(Dubbo/gRPC)

🎯 面试要点

  • 动态代理是 RPC 的入口(客户端),反射/映射是服务端分发的关键——与 Java 基础模块呼应
  • RPC 三要素:序列化、网络传输、动态代理

2. Dubbo 的核心架构?

Dubbo(阿里开源,国内微服务主流)分层架构:

调用流程:Provider 启动注册 → Consumer 订阅列表并缓存 → 本地负载均衡选节点(默认加权随机)→ 集群容错(failover 失败重试 / failfast 快速失败)→ 过滤链(上下文/限流/监控)→ 序列化(Hessian2)→ Netty 传输。

🎯 面试要点

  • 集群容错:Failover(重试其他节点,默认)、Failfast(快速失败)、Failsafe(失败忽略)、Failback(失败异步重试)、Forking(并行调多个取第一个成功)
  • 服务降级:mock 参数返回兜底
  • Dubbo3 支持 Triple 协议(HTTP/2 + gRPC 兼容),云原生方向

3. 序列化方式对比与选择?

方式 特点 适用
JSON(Jackson/Gson)可读、跨语言、体积大HTTP 接口、日志
Hessian2二进制、跨语言、Dubbo 默认Java RPC
Protobuf最快最小、强类型、需 .proto 定义gRPC、高性能链路
Java 原生仅 Java、有安全问题、性能差不推荐
Kryo/FSTJava 生态快、需注册类Java 内部高性能

🎯 面试要点

  • 选型维度:性能、体积、跨语言、兼容性(字段增删)、安全性
  • 兼容性实践:序列化版本号 serialVersionUID、新增字段默认值

4. gRPC 的特点?

🎯 面试要点

  • 对比 Dubbo:gRPC 强在跨语言 + HTTP/2 生态(云原生标配);Dubbo 强在治理功能丰富(Java 生态)
  • gRPC 用 HTTP/2 而非自定义 TCP 协议——学习成本低、可观测性好

🎤 常见面试追问

  1. RPC 调用链路(必背)?——客户端动态代理(看似本地方法)→ 序列化(方法+参数)→ 网络传输(Netty/HTTP)→ 服务端反序列化 + 定位实现 → 执行 → 结果序列化返回。
  2. RPC 和 HTTP 调用怎么选?——内部高频调用、要治理能力(注册/负载/重试)→ RPC(Dubbo/gRPC);对外接口、跨语言、可调试 → HTTP REST。
  3. Dubbo 的集群容错有哪些?——Failover(失败重试其他节点,默认)、Failfast(快速失败)、Failsafe(失败忽略)、Failback(异步重试)、Forking(并行调多个)。
  4. 序列化怎么选?——跨语言高性能 → Protobuf(gRPC 标配);Java 内部 → Hessian2(Dubbo 默认)/Kryo;可读调试 → JSON。看性能/体积/跨语言/兼容性。
  5. gRPC 和 Dubbo 的区别?——gRPC:HTTP/2 + Protobuf,跨语言、云原生(K8s 生态);Dubbo:治理功能全(Java 生态),国内主流。Dubbo3 也兼容 gRPC 协议。

📖 名词解释(本页术语)

术语 大白话解释
RPC远程过程调用:像调本地方法一样调用另一台机器的方法。三要素:序列化 + 网络传输 + 动态代理。
Dubbo阿里开源 RPC 框架:注册发现/负载均衡/容错/限流治理一体,国内微服务标配。
gRPCGoogle 的 RPC 框架:HTTP/2 + Protobuf,跨语言、支持双向流,云原生标配。
序列化对象 ↔ 字节流的转换:传输和存储的基础。JSON/Hessian2/Protobuf/Kryo。
动态代理RPC 客户端入口:调用方拿的是代理对象,代理负责"打包请求发出去"。
Failover / Failfast容错策略:Failover 失败换节点重试(默认);Failfast 立即失败(幂等性要求高的用)。
ProtobufGoogle 的二进制序列化格式:最快最小、强类型,.proto 文件定义接口。
HTTP/2gRPC 的传输基础:多路复用、双向流、头部压缩——比 HTTP/1.1 高效。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。