gRPC 服务定义 + Protobuf 生成 TypeScript 客户端/服务端

发布于 2026/8/4作者:TokenLens发私信来源:self
Token 建议输入 ≤15000 · 输出预留 10000gpt-4oclaude-3.5-sonnet

设计 gRPC 服务契约,生成 Protobuf 定义、TypeScript 存根、服务端实现骨架、Buf 工作流

提示词

你是 gRPC 微服务专家。任务:设计生产级 gRPC 服务契约与实现。

约束:

  1. Protobuf 设计:
    • 语法:proto3
    • 包名:反向域名 + 版本(com.example.v1)
    • 消息命名:PascalCase,字段 snake_case
    • 使用 well-known types(Timestamp, Duration, Any, Empty)
    • 枚举首项为 0(UNSPECIFIED)
    • 分页:page_token + page_size
  2. 服务设计:
    • 单元 RPC、服务端流、客户端流、双向流
    • 幂等性:幂等键字段
    • 错误:google.rpc.Status + 自定义错误详情
  3. 代码生成:buf generate -> TypeScript (grpc-web/connectrpc)
  4. 服务端:NestJS/grpc-node 实现骨架,拦截器(日志、指标、认证)
  5. 输出:proto/ 目录 + buf.yaml + buf.gen.yaml + 生成代码 + 服务端骨架

输出格式:

// proto/service.proto
buf.yaml:
// server/service.ts

少样本示例

展示完整 gRPC 服务定义、HTTP 映射、流式 RPC、Buf 配置、NestJS 实现

输入

业务:用户服务。需求:创建用户、获取用户、列表用户(分页)、更新用户、删除用户、批量获取、监听用户变更流。

输出

// proto/user/v1/user.proto
syntax = "proto3";
package user.v1;

import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
import "google/api/annotations.proto";

service UserService {
rpc CreateUser(CreateUserRequest) returns (User) {
option (google.api.http) = { post: "/v1/users" body: "user" };
}
rpc GetUser(GetUserRequest) returns (User) {
option (google.api.http) = { get: "/v1/users/{id}" };
}
rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) {
option (google.api.http) = { get: "/v1/users" };
}
rpc UpdateUser(UpdateUserRequest) returns (User) {
option (google.api.http) = { patch: "/v1/users/{user.id}" body: "user" };
}
rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty) {
option (google.api.http) = { delete: "/v1/users/{id}" };
}
rpc BatchGetUsers(BatchGetUsersRequest) returns (BatchGetUsersResponse) {
option (google.api.http) = { post: "/v1/users:batchGet" body: "ids" };
}
rpc WatchUsers(WatchUsersRequest) returns (stream WatchUsersResponse);
}

message User {
string id = 1;
string email = 2;
string display_name = 3;
google.protobuf.Timestamp created_at = 4;
google.protobuf.Timestamp updated_at = 5;
}

message CreateUserRequest { User user = 1; }
message GetUserRequest { string id = 1; }
message ListUsersRequest { int32 page_size = 1; string page_token = 2; }
message ListUsersResponse { repeated User users = 1; string next_page_token = 2; }
message UpdateUserRequest { User user = 1; google.protobuf.FieldMask update_mask = 2; }
message DeleteUserRequest { string id = 1; }
message BatchGetUsersRequest { repeated string ids = 1; }
message BatchGetUsersResponse { repeated User users = 1; }
message WatchUsersRequest { repeated string user_ids = 1; }
message WatchUsersResponse { User user = 1; WatchEventType event_type = 2; }
enum WatchEventType { UNSPECIFIED = 0; CREATED = 1; UPDATED = 2; DELETED = 3; }

// buf.yaml
version: v1
name: buf.build/yourorg/user
breaking:
use:
- FILE
lint:
use:
- DEFAULT

// server/user.service.ts (NestJS)
@Injectable()
export class UserService implements UserServiceInterface {
constructor(private repo: UserRepository) {}
async createUser(req: CreateUserRequest): Promise<User> { ... }
async getUser(req: GetUserRequest): Promise<User> { ... }
// ... other methods
}

改写到我的

评分

暂无评分

登录后可为这条 Prompt 打分

评价与讨论

直接在本页发言

加载讨论…

登录后即可在本页参与讨论

API 设计编程与工程typescriptgrpcprotobufmicroservicebuf