为什么选 gRPC
gRPC 由 Google 开源,基于 HTTP/2 和 Protocol Buffers(protobuf),相比 REST+JSON 有明显优势:
- 二进制序列化体积更小(约为 JSON 的 1/5)
- HTTP/2 多路复用减少连接开销
- 强类型 IDL(.proto 文件)即 API 文档
- 支持四种通信模式:一元、服务端流、客户端流、双向流
Proto 文件设计
syntax = "proto3";
package user;
service UserService {
rpc GetUser(GetUserReq) returns (GetUserRes);
rpc ListUsers(ListUsersReq) returns (stream User); // 服务端流
rpc CreateUsers(stream User) returns (CreateUsersRes); // 客户端流
rpc Chat(stream Message) returns (stream Message); // 双向流
}
message GetUserReq { int64 id = 1; }
message User { int64 id = 1; string name = 2; string email = 3; }
Node.js gRPC 服务端
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
const packageDef = protoLoader.loadSync("user.proto");
const grpcObj = grpc.loadPackageDefinition(packageDef);
const server = new grpc.Server();
server.addService(grpcObj.user.UserService.service, {
GetUser: (call, callback) => {
const user = db.find(call.request.id);
callback(null, user);
},
ListUsers: (call) => {
db.streamAll().forEach(user => call.write(user));
call.end();
},
});
server.bindAsync("0.0.0.0:50051", grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
四种通信模式对比
| 模式 | 场景 |
|---|---|
| Unary | 普通请求-响应(CRUD) |
| Server Streaming | 数据导出、实时推送 |
| Client Streaming | 批量上传、日志采集 |
| Bidirectional | 聊天、协作编辑 |
生产部署要点
- 使用 TLS/SSL 加密通信
- 配置 keepalive 参数防止连接断开
- 通过拦截器(Interceptor)实现认证、日志、限流
- 结合 Envoy/Istio 实现服务网格