用户微服务的 proto 文件设计
用户微服务需要提供注册和登录两个核心接口,使用 proto3 语法定义。
user.proto
syntax = "proto3";
package user;
// 用户服务
service UserService {
// 根据 username 和 password 查找用户(登录)
rpc FindOne (FindOneRequest) returns (FindOneResponse) {}
// 创建新用户(注册)
rpc Create (CreateUserRequest) returns (CreateUserResponse) {}
}
// 登录请求
message FindOneRequest {
string username = 1;
string password = 2;
}
// 登录响应
message FindOneResponse {
int32 id = 1;
string username = 2;
string access_token = 3;
}
// 注册请求
message CreateUserRequest {
string username = 1;
string password = 2;
string email = 3;
}
// 注册响应
message CreateUserResponse {
int32 id = 1;
string username = 2;
}
protobuf
proto 文件编写规范
| 规范 | 说明 |
|---|---|
| Request/Response 命名 | 每个方法的请求和响应分别命名,如 FindOneRequest/FindOneResponse |
| 字段编号 | 每个字段的编号必须唯一,从 1 开始递增 |
| 字段类型 | 使用 proto3 支持的类型(int32, string, bool, repeated 等) |
| 包名 | 使用与服务名对应的包名,避免冲突 |
VSCode 插件辅助编写
安装 vscode-proto3 插件后,在编辑 proto 文件时会获得以下辅助:
- 输入
service自动补全 service 模板 - 输入
rpc自动补全方法签名 - 输入
message自动补全消息结构 - 语法错误实时提示
NestJS 服务端实现
配置 gRPC 传输器
// main.ts
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.GRPC,
options: {
package: 'user',
protoPath: join(__dirname, '../../../shared/proto/user.proto'),
url: 'localhost:5001',
},
},
);
typescript
实现控制器
// user.controller.ts
import { Controller } from '@nestjs/common';
import { GrpcMethod } from '@nestjs/microservices';
interface FindOneRequest {
username: string;
password: string;
}
interface FindOneResponse {
id: number;
username: string;
access_token: string;
}
@Controller()
export class UserController {
@GrpcMethod('UserService', 'FindOne')
async findOne(data: FindOneRequest): Promise<FindOneResponse> {
// 模拟用户查询
if (data.username === 'admin' && data.password === '123456') {
return {
id: 1,
username: 'admin',
access_token: 'jwt-token-here',
};
}
return { id: 0, username: '', access_token: '' };
}
@GrpcMethod('UserService', 'Create')
async create(data: CreateUserRequest): Promise<CreateUserResponse> {
return { id: Date.now(), username: data.username };
}
}
typescript
使用 grpcurl 测试
# 测试登录接口
grpcurl -plaintext -d '{"username":"admin","password":"123456"}' \
localhost:5001 user.UserService/FindOne
# 测试注册接口
grpcurl -plaintext -d '{"username":"newuser","password":"123456","email":"test@example.com"}' \
localhost:5001 user.UserService/Create
bash
使用 BloomRPC(GUI 工具)测试
除了命令行工具,还可以使用 GUI 工具进行测试:
- BloomRPC -- 开源的 gRPC GUI 客户端,支持导入 proto 文件
- Kreya -- 功能更强大的 gRPC GUI 客户端,支持环境变量
这些工具提供了图形界面,可以更直观地查看和测试 gRPC 接口。
↑