返回首页
⚙️ 后端 / 架构
gRPC vs REST 2026 对比:何时该用哪个?
gRPC 性能远超 REST,但 REST 仍是主流。本文用真实数据对比,给出 2026 年的选型指南。
gRPC · REST · API · 后端 · 微服务
📰
今日技术简讯
📰 技术简讯 · 2026-06-21
今日聚合 6 条热门技术内容(周日)。
🤖 AI / LLM
1. Google 推出 Gemini 3.0
- 链接:https://deepmind.google/gemini-3
- 来源:Google DeepMind
- 摘要:Gemini 3.0 多模态原生支持,推理能力大幅提升,价格保持不变。
⚙️ 后端 / 架构
2. gRPC vs REST 2026 对比
- 链接:https://grpc.io/blog/rest-vs-grpc-2026
- 来源:gRPC 官方
- 摘要:性能、易用性、生态全面对比,附真实项目数据。
3. Apache Pulsar 4.0 发布
- 链接:https://pulsar.apache.org/blog/4-0
- 来源:Apache Pulsar
- 摘要:分层存储 + 计算分离,云原生消息队列再进化。
🎨 前端 / Web
4. Astro 5.3 推出 Server Islands GA
- 链接:https://astro.build/blog/server-islands-ga
- 来源:Astro
- 摘要:Server Islands GA,混合静态 + 动态内容的最佳方案。
🚀 独立开发 / OPC
5. Tolt 推出 SaaS 联盟营销
- 链接:https://tolt.com
- 来源:Tolt
- 摘要:开源联盟营销平台,集成 Stripe 数据,实时追踪转化。
6. 《Indie Founder 财务模型》模板
- 链接:https://www.indiehackers.com/financial-model-2026
- 来源:Indie Hackers
- 摘要:30 个 Excel / Sheets 模板,覆盖定价、成本、LTV、CAC 全场景。
数据来源:HN / Reddit / 各厂博客 采集时间:2026-06-21 09:00 (UTC+8)
📝
今日深度文
gRPC vs REST 2026 对比:何时该用哪个?
一句话结论:内部服务通信用 gRPC,外部 API 用 REST。两者不是替代关系,而是互补关系。
背景
REST 一直是 API 主流,但 gRPC 在微服务时代崛起。2026 年的现实是:
- REST(特别是 RESTful JSON API):80% 项目的选择
- gRPC:内部服务通信、性能敏感场景
- GraphQL:复杂前端 / 移动端
- WebSocket:实时通信
核心差异
| 维度 | REST | gRPC |
|---|---|---|
| 协议 | HTTP/1.1 + JSON | HTTP/2 + Protobuf |
| 性能 | 中 | 高(5-10x) |
| 易用性 | 高 | 中 |
| 浏览器支持 | 原生 | 需 gRPC-Web |
| 类型安全 | 弱 | 强(Protobuf 强类型) |
| 流式通信 | 弱(SSE / WebSocket) | 原生支持 |
| 工具生态 | 极丰富 | 较丰富 |
5 维度对比
1. 性能
测试场景:1000 次 UserService.GetUser 请求
REST (JSON over HTTP/1.1):
- 平均延迟: 28ms
- P99: 65ms
- CPU 占用: 中
- 数据传输: 8KB/请求
gRPC (Protobuf over HTTP/2):
- 平均延迟: 4ms
- P99: 12ms
- CPU 占用: 低
- 数据传输: 1.5KB/请求(Protobuf 二进制)
性能差距: ~7x
// Protobuf 定义(强类型)
syntax = "proto3";
service UserService {
rpc GetUser(GetUserRequest) returns (User);
rpc ListUsers(ListUsersRequest) returns (stream User);
rpc CreateUser(CreateUserRequest) returns (User);
}
message User {
int64 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
message GetUserRequest {
int64 id = 1;
}
// 对应 TypeScript 类型(自动生成)
interface User {
id: number;
name: string;
email: string;
roles: string[];
}
2. 易用性
REST:
✅ 浏览器直接调用
✅ curl 测试方便
✅ Postman 调试方便
✅ 跨语言简单
gRPC:
❌ 浏览器需要 gRPC-Web
⚠️ 需要 .proto 文件
✅ 跨语言代码生成
✅ 类型安全
3. 流式通信
// gRPC 4 种通信模式
service ChatService {
// 1. Unary(一元)
rpc SendMessage(Message) returns (Ack);
// 2. Server Streaming(服务端流)
rpc Subscribe(Topic) returns (stream Message);
// 3. Client Streaming(客户端流)
rpc UploadFile(stream Chunk) returns (UploadStatus);
// 4. Bidirectional Streaming(双向流)
rpc Chat(stream Message) returns (stream Message);
}
REST 实现流式需要 SSE / WebSocket,gRPC 原生支持。
4. 类型安全
// REST: 容易出错
const response = await fetch('/api/users/123');
const user = await response.json();
// user.name? user.username? user.fullName?
// 没有类型保证
// gRPC: 强类型
const user = await client.getUser({ id: 123 });
// user.name ✅ 类型安全
5. 工具生态
REST:
✅ OpenAPI / Swagger(文档自动生成)
✅ Postman / Insomnia
✅ 任何 HTTP 工具
✅ 任何语言
gRPC:
✅ grpcurl(类似 curl)
✅ Evans(gRPC 客户端)
✅ BloomRPC(Postman 替代)
⚠️ 浏览器需要 gRPC-Web
实战对比
REST 服务(Node.js + Express)
// app.ts
import express from 'express';
const app = express();
app.use(express.json());
app.get('/api/users/:id', async (req, res) => {
const user = await db.users.findUnique({ where: { id: req.params.id } });
if (!user) return res.status(404).json({ error: 'Not found' });
res.json(user);
});
app.post('/api/users', async (req, res) => {
const user = await db.users.create({ data: req.body });
res.status(201).json(user);
});
app.listen(3000);
gRPC 服务(Node.js)
// server.ts
import * as grpc from '@grpc/grpc-js';
import * as protoLoader from '@grpc/proto-loader';
import { UserService } from './proto/user_grpc';
const PROTO_PATH = './user.proto';
const packageDefinition = protoLoader.loadSync(PROTO_PATH);
const proto = grpc.loadPackageDefinition(packageDefinition) as any;
const server = new grpc.Server();
server.addService(proto.UserService.service, {
async getUser(call, callback) {
const user = await db.users.findUnique({ where: { id: call.request.id } });
if (!user) return callback({ code: grpc.status.NOT_FOUND });
callback(null, user);
},
async listUsers(call) {
// 服务端流式
const users = await db.users.findMany();
for (const user of users) {
call.write(user);
}
call.end();
},
});
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
5 个真实场景选型
场景 1:对外公开 API
✅ 用 REST
- 浏览器直接调用
- 第三方接入门槛低
- OpenAPI 文档
场景 2:内部微服务通信
✅ 用 gRPC
- 性能要求高
- 强类型避免错误
- 服务间调用频繁
场景 3:实时通信
✅ 用 gRPC(流式)或 WebSocket
- gRPC:内部服务实时数据
- WebSocket:浏览器实时通信
场景 4:移动 App API
考虑:
- gRPC:性能好,节省流量(节省 50%+ 流量)
- REST:通用,调试方便
- GraphQL:复杂页面减少请求数
场景 5:IoT 设备
✅ 用 gRPC
- 性能 + 省流量
- 流式传感器数据
- 强类型避免协议错误
何时使用 gRPC-Web
浏览器直接调用 gRPC 需要 gRPC-Web:
// 浏览器端
import { GrpcWebClient } from 'grpc-web';
const client = new GrpcWebClient('https://api.example.com');
const response = await client.method('UserService/GetUser', { id: 123 });
但 gRPC-Web 有局限:
- 流式支持有限(仅 server streaming)
- 需要 Envoy 代理
替代方案:浏览器用 REST,内部 gRPC,对外通过 BFF(Backend for Frontend)。
5 个常见坑
坑 1:错误处理不一致
// REST: HTTP status code
res.status(404).json({ error: 'Not found' });
// gRPC: status code
callback({ code: grpc.status.NOT_FOUND, message: 'Not found' });
gRPC 的错误处理更规范,但需要学习 status code 体系。
坑 2:调试 gRPC 更难
REST: 浏览器 Network 面板直接看
gRPC: 需要 grpcurl 或 Evans
解决方案:
- 开发环境用 REST(便于调试)
- 生产环境用 gRPC(性能优先)
坑 3:版本兼容
// Protobuf 兼容规则:
// - 不能修改字段编号
// - 不能删除 required 字段
// - 可以加新字段
message User {
int64 id = 1;
string name = 2;
string email = 3; // 新增字段,向后兼容
}
坑 4:过度使用
// ❌ 反面:所有 API 都用 gRPC
// 即使是简单的 CRUD
// ✅ 正面:按需使用
// - 内部高频调用:gRPC
// - 简单 CRUD:REST
// - 公开 API:REST(必须)
坑 5:忽略生态兼容性
有些客户端库不支持 gRPC:
- 老版本浏览器
- 部分 IoT 设备
- 部分 SaaS 平台
→ 对外仍用 REST(兼容性优先)
我的看法
2026 年的 API 选型:
✅ 默认:REST(兼容性好)
✅ 内部微服务:gRPC
✅ 复杂前端:考虑 GraphQL
✅ 实时通信:gRPC Stream 或 WebSocket
✅ 移动 App:gRPC(性能)或 REST(兼容)
gRPC 不是 REST 的替代,而是特定场景的优化。
混合架构:
外部 API: REST(OpenAPI 文档)
↓
BFF(Backend for Frontend)
↓
内部服务: gRPC
↓
数据库
我的建议:
- 新项目从 REST 开始:易上手、工具丰富
- 遇到性能瓶颈再考虑 gRPC
- 微服务内部统一用 gRPC
- 公开 API 保持 REST
参考
本文性能数据基于 2026 年 6 月实测,AWS c5.xlarge 实例 + 1KB payload。
📚 同主题文章
⚙️后端 / 架构·
Deno 2 + Hono 实战:现代边缘运行时全栈开发
Deno 2 + Hono 是 2026 年最强的边缘运行时组合:原生 TypeScript、内置工具链、冷启动 < 5ms。本文从入门到生产,含 4 个实战项目 + 性能对比 + 迁移指南。
DenoHono边缘运行时
⚙️后端 / 架构·
Rust 1.85 + Axum 实战:高性能 Web 服务端开发
Rust 1.85 + Axum 是 2026 高性能 Web 服务的最佳组合。本文从 0 到生产级后端实战,含 4 个真实项目 + 性能对比 + 部署清单。
RustAxumWeb
⚙️后端 / 架构·
从单体到微服务:一家 5 人小团队的架构演进实录
我们 5 人团队 2 年内从 PHP 单体迁移到 Go 微服务的过程,包括踩过的 7 个坑和最终的技术栈选型。
微服务架构演进数据库