Skip to content

概念卡片:RPC 框架对比(Dubbo / gRPC / Feign)

一句话机制:RPC 框架都解决「远程调用像本地调用」,但实现路线不同——Dubbo 是 Java 生态、长连接 + 服务治理;gRPC 是跨语言、HTTP/2 + Protobuf + 流式;Feign 是声明式 HTTP、Spring Cloud 生态。选型看「语言边界 + 性能要求 + 生态」。

三框架对比

维度DubbogRPCFeign(OpenFeign)
厂商阿里GoogleSpring Cloud
协议Dubbo 协议(长连接 NIO)HTTP/2 + ProtobufHTTP/1.1
序列化多种(hessian/kryo)Protobuf(二进制、体积小)JSON
跨语言主要 Java(proto 编译多语言)弱(Java 生态)
流式传输支持(4 种流式)不支持
服务治理强(注册/路由/容错/监控)弱(需配合服务网格)弱(依赖 Spring Cloud)
典型场景内部 Java 微服务跨语言 / 高性能内部调用Spring Cloud 服务间 HTTP 调用

gRPC vs Restful

维度gRPCRestful
文档规范proto 文件(文档即代码)各写各的,易过时
编码Protobuf 二进制JSON
协议HTTP/2HTTP/1.1
性能高(体积小 + HTTP/2)较低
流式支持不支持
浏览器支持
可读性差(二进制难调试)

关键代码示例(gRPC 的 proto)

protobuf
syntax = "proto3";
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }

编译 proto 生成 stub,客户端调用 SayHello 就像调本地函数(跨语言、跨机器)。

不变量(必须成立的约束)

  • gRPC 的接口定义在 proto 文件(IDL),编译生成多语言 stub,这是它跨语言的根基。
  • gRPC 用于内部服务调用(性能高),Restful 用于对外(浏览器友好)。
  • Dubbo 服务治理强但绑定 Java;gRPC 跨语言但治理弱——微服务治理场景常「Dubbo/Spring Cloud 为主,gRPC 做跨语言补充」。

踩坑案例

  • 现象:gRPC 接口联调困难,抓包看不到可读的请求内容。 原因:Protobuf 二进制编码,不可读。解决:用 grpcui/grpcurl 调试,或启用 reflection。

常见误解

  • 以为 RPC 只有 Dubbo → gRPC 是跨语言的现代 RPC,Feign 是声明式 HTTP,各有适用场景。
  • 以为 gRPC 能完全替代 Restful → 浏览器支持差、可读性差,对外 API 仍以 Restful 为主。

关联

最近更新