主题
概念卡片:RPC 框架对比(Dubbo / gRPC / Feign)
一句话机制:RPC 框架都解决「远程调用像本地调用」,但实现路线不同——Dubbo 是 Java 生态、长连接 + 服务治理;gRPC 是跨语言、HTTP/2 + Protobuf + 流式;Feign 是声明式 HTTP、Spring Cloud 生态。选型看「语言边界 + 性能要求 + 生态」。
三框架对比
| 维度 | Dubbo | gRPC | Feign(OpenFeign) |
|---|---|---|---|
| 厂商 | 阿里 | Spring Cloud | |
| 协议 | Dubbo 协议(长连接 NIO) | HTTP/2 + Protobuf | HTTP/1.1 |
| 序列化 | 多种(hessian/kryo) | Protobuf(二进制、体积小) | JSON |
| 跨语言 | 主要 Java | 强(proto 编译多语言) | 弱(Java 生态) |
| 流式传输 | 支持 | 强(4 种流式) | 不支持 |
| 服务治理 | 强(注册/路由/容错/监控) | 弱(需配合服务网格) | 弱(依赖 Spring Cloud) |
| 典型场景 | 内部 Java 微服务 | 跨语言 / 高性能内部调用 | Spring Cloud 服务间 HTTP 调用 |
gRPC vs Restful
| 维度 | gRPC | Restful |
|---|---|---|
| 文档规范 | proto 文件(文档即代码) | 各写各的,易过时 |
| 编码 | Protobuf 二进制 | JSON |
| 协议 | HTTP/2 | HTTP/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 为主。
关联
- RPC 总览:RPC技术栈总览
- Dubbo:[概念卡片:Dubbo RPC框架](./概念卡片:Dubbo RPC框架)
- OpenFeign:概念卡片:OpenFeign声明式调用
- 源:
B40-资源/语雀-Code-Summary/Middleware/RPC&Gateway/RPCgRPC(2 篇)