外观
一句话答案
Dubbo RPC 调用链:代理拦截→负载均衡选节点→序列化(Hessian2)→网络传输(Netty)→反序列化→执行→返回。
核心要点
核心对比表:
| 维度 | REST (HTTP/JSON) | gRPC | Dubbo |
|---|---|---|---|
| 传输协议 | HTTP/1.1(文本) | HTTP/2(二进制帧) | 自定义 TCP 协议(Dubbo Protocol) |
| 序列化 | JSON(文本,可读性强) | Protobuf(二进制,体积小 3-10 倍) | Hessian2 / Protobuf / JSON |
| IDL | OpenAPI / Swagger(可选) | .proto 文件(强制) | Java 接口(强制) |
| 代码生成 | 可选(Swagger CodeGen) | 强制(protoc 编译器生成客户端/服务端代码) | 强制(共享 API JAR 包) |
| 性能 | 低(JSON 解析慢,HTTP/1.1 连接开销) | 高(二进制序列化 + HTTP/2 多路复用) | 高(长连接 + 二进制序列化) |
| 流式传输 | 不支持(SSE/WebSocket 是补充方案) | 原生支持(单向流、双向流) | 不支持(2.x 有异步调用) |
| 跨语言 | 天然跨语言(HTTP + JSON) | 强跨语言(官方支持 10+ 语言) | 弱(主要 Java,Go 版本不成熟) |
| 服务治理 | 无内置(需搭配 Spring Cloud) | 无内置(需自行集成) | 内置丰富(负载均衡、熔断、路由) |
| 浏览器调用 | 支持 | 不支持(需 gRPC-Web 代理) | 不支持 |
| 可读性/调试 | 高(curl、Postman 直接调试) | 低(二进制,需专用工具) | 低(需要 Dubbo Admin) |
| 生态 | 最广泛(所有语言、所有框架) | Google、CNCF 生态 | 阿里巴巴、Apache 生态 |
选型建议:
① REST(HTTP/JSON):
→ 对外暴露 API(面向前端、第三方、移动端)
→ 跨团队、跨组织的 API 协作(OpenAPI 文档)
→ 简单的内部微服务通信(性能要求不高)
→ 需要快速调试和人工排查
② gRPC:
→ 内部高性能微服务通信(延迟敏感、吞吐量大)
→ 多语言微服务(Go + Java + Python 混合架构)
→ 需要流式通信的场景(实时数据推送、双向通信)
→ 强类型约束(.proto 文件强制定义接口)
③ Dubbo:
→ Java 为主的微服务架构
→ 需要丰富的服务治理(路由、权重、灰度)
→ 阿里巴巴技术栈 / Spring Cloud Alibaba 生态
→ 大规模 Java 微服务集群
实际项目中常见组合:
外部 API → REST(Spring MVC / Spring WebFlux)
内部高频调用 → gRPC 或 Dubbo
配置中心 + 注册中心 → NacosgRPC Protobuf 示例:
protobuf
// order.proto
syntax = "proto3";
package order;
service OrderService {
// 一元 RPC
rpc GetOrder (GetOrderRequest) returns (OrderResponse);
// 服务端流式 RPC
rpc ListOrders (ListOrdersRequest) returns (stream OrderResponse);
// 双向流式 RPC
rpc OrderChat (stream OrderMessage) returns (stream OrderMessage);
}
message GetOrderRequest {
int64 order_id = 1;
}
message OrderResponse {
int64 id = 1;
string product_name = 2;
double amount = 3;
string status = 4;
}追问与易错
追问方向:
- Dubbo SPI 和 Java SPI 区别?
- Dubbo 服务降级怎么做?
- Dubbo 和 Spring Cloud 怎么选?
易错点:
- ❌ Dubbo 和 Feign 一样——Dubbo 是 RPC Feign 是 HTTP
- ❌ Dubbo 只能用 ZK——支持多种注册中心
💡 记忆锚点
三种通信方式像三种快递:REST=普通平邮(谁都能寄,慢但通用,适合对外API);gRPC=同城闪送(Protobuf二进制压缩+HTTP/2多路复用,快且跨语言);Dubbo=企业内部专线(Java生态自定义协议+内置服务治理,适合纯Java大集群)。对外REST,对内按需选gRPC或Dubbo。