8.5 KiB
8.5 KiB
ProfileService - 角色管理服务
ProfileService是CarrotSkin皮肤站的角色管理微服务,负责处理Minecraft角色的创建、管理、RSA密钥生成和签名验证等核心功能。
📋 目录
🚀 功能特性
核心功能
- 角色管理: 创建、查询、更新、删除Minecraft角色
- RSA密钥管理: 自动生成RSA-2048密钥对,支持数据签名和验证
- 皮肤/披风关联: 管理角色与皮肤、披风的关联关系
- 用户角色列表: 支持查询用户下的所有角色
- 数据验证: 完整的参数验证和业务逻辑检查
安全特性
- RSA签名: 支持使用私钥对数据进行签名
- 签名验证: 支持使用公钥验证数据签名
- 权限控制: 确保用户只能操作自己的角色
- 数据完整性: 完整的事务处理和数据一致性保证
🏗️ 技术架构
技术栈
- 框架: go-zero微服务框架
- 数据库: MySQL 8.0+
- 缓存: Redis (通过go-zero集成)
- 通信协议: gRPC
- 密钥算法: RSA-2048
服务架构
ProfileService
├── internal/
│ ├── config/ # 配置管理
│ ├── handler/ # gRPC处理器
│ ├── logic/ # 业务逻辑层
│ ├── model/ # 数据模型层
│ └── svc/ # 服务上下文
├── pb/ # Protocol Buffers定义
└── docs/ # 文档和SQL脚本
📊 数据模型
数据库表结构
CREATE TABLE `profiles` (
`uuid` VARCHAR(36) NOT NULL COMMENT '角色的UUID,通常为Minecraft玩家的UUID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '关联的用户ID',
`name` VARCHAR(16) NOT NULL COMMENT '角色名 (Minecraft In-Game Name)',
`skin_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的皮肤ID',
`cape_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的披风ID',
`rsa_private_key` TEXT NOT NULL COMMENT 'RSA-2048私钥 (PEM格式)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`uuid`),
INDEX `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
数据类型映射
| 字段 | SQL类型 | Go Model类型 | Proto类型 | 说明 |
|---|---|---|---|---|
| uuid | VARCHAR(36) | string | string | 角色UUID |
| user_id | BIGINT UNSIGNED | uint64 | int64 | 用户ID |
| name | VARCHAR(16) | string | string | 角色名 |
| skin_id | BIGINT UNSIGNED NULL | sql.NullInt64 | int64 | 皮肤ID (0表示无皮肤) |
| cape_id | BIGINT UNSIGNED NULL | sql.NullInt64 | int64 | 披风ID (0表示无披风) |
| rsa_private_key | TEXT | string | string | RSA私钥 |
| created_at | TIMESTAMP | time.Time | string | 创建时间 |
| updated_at | TIMESTAMP | time.Time | string | 更新时间 |
🔌 API接口
对外接口 (Public APIs)
1. CreateProfile - 创建角色
rpc CreateProfile(CreateProfileRequest) returns (CreateProfileResponse);
- 功能: 创建新的Minecraft角色
- 验证: UUID格式、角色名格式、用户权限
- 特性: 自动生成RSA密钥对、角色名去重检查
2. GetProfile - 获取角色信息
rpc GetProfile(GetProfileRequest) returns (GetProfileResponse);
- 功能: 根据UUID获取角色基本信息
- 返回: 不包含私钥的公开信息
3. GetProfilesByUserId - 获取用户角色列表
rpc GetProfilesByUserId(GetProfilesByUserIdRequest) returns (GetProfilesByUserIdResponse);
- 功能: 获取指定用户的所有角色列表
- 特性: 支持空结果返回
4. UpdateProfile - 更新角色信息
rpc UpdateProfile(UpdateProfileRequest) returns (UpdateProfileResponse);
- 功能: 更新角色名、皮肤ID、披风ID
- 验证: 角色名重复检查、权限验证
- 特性: 支持NULL值处理 (0表示移除)
5. DeleteProfile - 删除角色
rpc DeleteProfile(DeleteProfileRequest) returns (DeleteProfileResponse);
- 功能: 删除指定角色
- 验证: 权限检查
6. GetProfilePublicKey - 获取角色公钥
rpc GetProfilePublicKey(GetProfilePublicKeyRequest) returns (GetProfilePublicKeyResponse);
- 功能: 获取角色的RSA公钥
- 用途: 用于验证角色签名
7. VerifyProfileSignature - 验证角色签名
rpc VerifyProfileSignature(VerifyProfileSignatureRequest) returns (VerifyProfileSignatureResponse);
- 功能: 验证使用角色私钥生成的签名
- 算法: RSA-2048 + SHA-256
8. GetProfileWithProperties - 查询角色属性
rpc GetProfileWithProperties(GetProfileWithPropertiesRequest) returns (GetProfileWithPropertiesResponse);
- 功能: 查询角色完整信息,包含Minecraft协议兼容的属性和签名
- 用途: 用于游戏客户端获取皮肤、披风等信息
- 特性: 支持生成带签名和不带签名的属性
9. GetProfilesByNames - 批量查询角色
rpc GetProfilesByNames(GetProfilesByNamesRequest) returns (GetProfilesByNamesResponse);
- 功能: 根据角色名称列表批量查询角色信息
- 返回: 简化的角色信息列表(UUID和名称)
10. GetUserIdByProfileName - 根据角色名获取用户ID
rpc GetUserIdByProfileName(GetUserIdByProfileNameRequest) returns (GetUserIdByProfileNameResponse);
- 功能: 根据角色名称查找关联的用户ID
- 用途: 支持使用角色名进行登录等操作
对内接口 (Internal APIs)
11. GetProfileInternalInfo - 获取角色内部信息
rpc GetProfileInternalInfo(GetProfileInternalInfoRequest) returns (ProfileInternalInfo);
- 功能: 获取包含私钥的完整角色信息
- 权限: 仅供内部微服务调用
- 安全: 包含敏感信息,需要严格权限控制
12. SignData - 使用私钥签名数据
rpc SignData(SignDataRequest) returns (SignDataResponse);
- 功能: 使用角色私钥对数据进行签名
- 算法: RSA-2048 + SHA-256
- 返回: Base64编码的签名结果
🚀 部署指南
环境要求
- Go 1.19+
- MySQL 8.0+
- Redis 6.0+
配置文件示例
# etc/profile.yaml
Name: profile.rpc
ListenOn: 0.0.0.0:8082
#Etcd:
# Hosts:
# - 127.0.0.1:2379
# Key: profile.rpc
DataSource: root:password@tcp(localhost:3306)/carrot_skin?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
CacheConf:
- Host: 127.0.0.1:6379
Pass: ""
Type: node
部署步骤
- 数据库初始化
mysql -u root -p carrot_skin < docs/profiles.sql
- 编译服务
go build -o profile-service .
- 启动服务
./profile-service -f etc/profile.yaml
🛠️ 开发指南
代码生成
使用提供的脚本重新生成代码:
# Windows
generate.bat
# Linux/Mac
chmod +x generate.sh
./generate.sh
业务逻辑扩展
所有业务逻辑都在 internal/logic/ 目录下:
createProfileLogic.go- 角色创建逻辑getProfileLogic.go- 角色查询逻辑updateProfileLogic.go- 角色更新逻辑deleteProfileLogic.go- 角色删除逻辑- 等等...
数据模型扩展
如需添加新的数据库方法,在 internal/model/profilesmodel.go 中扩展:
type ProfilesModel interface {
profilesModel
// 添加自定义方法
FindByUserId(ctx context.Context, userId uint64) ([]*Profiles, error)
}
🔧 故障排查
常见问题
1. 数据类型转换错误
问题: sql.NullInt64 类型处理错误
解决: 使用 nullInt64ToValue() 函数进行正确转换
2. RSA密钥生成失败
问题: RSA密钥生成或解析失败 解决: 检查系统随机数生成器,确保有足够的熵
3. 角色名重复
问题: 同一用户下角色名重复 解决: 创建和更新时都会进行重复检查
4. UUID格式错误
问题: UUID格式不符合标准 解决: 确保UUID为36位标准格式 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
日志级别
- INFO: 正常业务操作
- ERROR: 业务错误和系统错误
- DEBUG: 详细的调试信息
性能监控
- 数据库连接池状态
- Redis缓存命中率
- gRPC请求响应时间
- RSA密钥操作耗时