面试官问我 gRPC 和 REST 到底该怎么选,我是这么回答的
How I Answered the Interview Question: When to Choose gRPC vs REST
| Kevin Liu | 2026-07-28T14:45:18
上周面试被问到这个经典问题,把我的回答和面试官的追问整理成文章,分享给大家。
A structured analysis of when to choose gRPC vs REST, organized from a real interview Q&A session.
## 面试现场 面试官:"你在项目中用过 gRPC 吗?说说 gRPC 和 REST 的区别,以及什么时候该用哪个。" 说实话这个问题我准备过,但面试官后续的追问让我意识到自己理解的还不够深。 ## 我的回答 ### 协议层面的差异 ``` REST: 传输协议: HTTP/1.1(也支持 HTTP/2) 数据格式: JSON(文本) 接口定义: OpenAPI / Swagger(可选) gRPC: 传输协议: HTTP/2(必须) 数据格式: Protocol Buffers(二进制) 接口定义: .proto 文件(必须) ``` 最本质的区别是:**REST 是资源导向的架构风格,gRPC 是 RPC(远程过程调用)框架**。 REST 围绕资源设计 URL,用 HTTP 方法表示操作: ``` GET /api/users/123 → 获取用户 POST /api/users → 创建用户 PUT /api/users/123 → 更新用户 DELETE /api/users/123 → 删除用户 ``` gRPC 围绕服务和方法设计: ```protobuf service UserService { rpc GetUser(GetUserRequest) returns (User); rpc CreateUser(CreateUserRequest) returns (User); rpc UpdateUser(UpdateUserRequest) returns (User); rpc DeleteUser(DeleteUserRequest) returns (Empty); } ``` ### 性能对比 面试官追问:"性能差多少?" 我给了几个数据(基于我们实测): | 维度 | REST + JSON | gRPC + Protobuf | |------|------------|-----------------| | 序列化速度 | 1x | 5-10x | | 数据大小 | 1x | 0.3-0.5x | | 延迟(内网) | ~5ms | ~1ms | | 吞吐量 | ~5K QPS | ~15K QPS | Protobuf 是二进制序列化,比 JSON 快 5-10 倍。加上 HTTP/2 的多路复用和头部压缩,gRPC 在内网微服务通信场景下优势很大。 ### 什么时候用 REST 面试官:"那为什么不都用 gRPC?" 好问题。REST 在这些场景更合适: 1. **对外 API**:浏览器原生支持 HTTP + JSON,不需要额外的客户端库 2. **简单 CRUD**:REST 的资源模型天然适合 CRUD 操作 3. **缓存友好**:HTTP 缓存机制(ETag、Cache-Control)可以直接用 4. **调试方便**:curl 一行命令就能测,JSON 人眼可读 ### 什么时候用 gRPC 1. **微服务内部通信**:性能敏感,且两端都是后端服务 2. **流式传输**:gRPC 原生支持 4 种流模式(Unary、Server Streaming、Client Streaming、Bidirectional) 3. **强类型约束**:.proto 文件是契约,编译时就能发现接口不匹配 4. **多语言团队**:protoc 自动生成各语言的客户端代码 ### 面试官的追问 "如果一个项目里两者都要用呢?" 我们实际的做法是:**对外 REST,对内 gRPC,网关层做转换**。 ``` 浏览器 → REST → API Gateway → gRPC → 内部微服务 ↑ grpc-gateway 自动转换 ``` 用 `grpc-gateway` 可以从 `.proto` 文件自动生成 RESTful API,一套定义两种接口。 ## 面试官最后说 "回答得不错,补充一点:gRPC 的错误处理要注意,它有自己的一套 status code,和 HTTP status code 不一样,做网关转换的时候容易搞混。" 这确实是我忽略的点。gRPC 用 `google.rpc.Status`,错误码定义在 `google.rpc.Code` 里,比如 `NOT_FOUND`(5)、`INTERNAL`(13),需要映射到 HTTP 的 404、500。 面试虽然没通过最终轮(另一个原因),但这个问题的讨论让我收获很大,整理出来分享给大家。
## The Interview Question "When would you choose gRPC over REST?" This classic interview question led to a deep discussion covering protocol differences, performance benchmarks, and architectural patterns. ## Key Differences REST is resource-oriented (HTTP methods + URLs + JSON), while gRPC is a full RPC framework (HTTP/2 + Protocol Buffers + generated code). gRPC offers 5-10x faster serialization and 0.3-0.5x data size compared to JSON. ## When to Use Each REST excels for public APIs, simple CRUD, caching, and debugging. gRPC shines for internal microservice communication, streaming, strong typing, and multi-language codebases. ## The Hybrid Approach Use REST externally and gRPC internally, with grpc-gateway at the API layer for automatic protocol translation from a single .proto definition.