Develop

gRPC 微服务通信:Protocol Buffers 与高性能 RPC 实践

✎ -- 字 🕐 -- 分钟
字号

为什么选 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 实现服务网格