Skip to content
困难

一句话答案

Dubbo RPC 调用链:代理拦截→负载均衡选节点→序列化(Hessian2)→网络传输(Netty)→反序列化→执行→返回。

核心要点

核心对比表:

维度REST (HTTP/JSON)gRPCDubbo
传输协议HTTP/1.1(文本)HTTP/2(二进制帧)自定义 TCP 协议(Dubbo Protocol)
序列化JSON(文本,可读性强)Protobuf(二进制,体积小 3-10 倍)Hessian2 / Protobuf / JSON
IDLOpenAPI / 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
   配置中心 + 注册中心 → Nacos

gRPC 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。