5.4 KiB
5.4 KiB
Provider层实现文档
一、认证Provider(AuthProvider)
1.1 功能概述
实现了认证相关的Dubbo-go Provider接口,作为Service层和Dubbo-go框架之间的桥梁。
1.2 实现的方法
Register- 用户注册Login- 用户登录Logout- 用户登出RefreshToken- 刷新TokenValidateToken- 验证TokenReference- 返回服务引用名称
1.2 接口实现
type AuthProvider struct {
authService service.AuthService
}
// Reference 返回服务引用名称(Dubbo-go要求)
func (p *AuthProvider) Reference() string
// Register 用户注册
func (p *AuthProvider) Register(ctx context.Context, req *pb.RegisterRequest) (*pb.RegisterResponse, error)
// Login 用户登录
func (p *AuthProvider) Login(ctx context.Context, req *pb.LoginRequest) (*pb.LoginResponse, error)
// Logout 用户登出
func (p *AuthProvider) Logout(ctx context.Context, req *pb.LogoutRequest) (*pb.LogoutResponse, error)
// RefreshToken 刷新Token
func (p *AuthProvider) RefreshToken(ctx context.Context, req *pb.RefreshTokenRequest) (*pb.RefreshTokenResponse, error)
// ValidateToken 验证Token
func (p *AuthProvider) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error)
1.3 实现要点
- 请求日志记录:记录所有请求,便于追踪和调试
- Service层调用:直接调用Service层方法,不包含业务逻辑
- 错误处理:捕获Service层错误,转换为proto响应格式
- Reference方法:实现Dubbo-go要求的Reference()方法,返回服务名称
1.4 使用示例
// 创建Service实例
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
db := database.GetDB()
authService := service.NewAuthService(userRepo, fanProfileRepo, starRepo, db)
// 创建Provider实例
authProvider := provider.NewAuthProvider(authService)
// 在Dubbo-go中注册Provider
config.SetProviderService(authProvider)
1.5 错误处理
Provider层负责:
- 捕获Service层返回的错误
- 如果响应为空,构建包含错误信息的响应
- 确保所有错误都转换为proto格式的响应
Service层已经处理了详细的错误和状态码,Provider层主要确保响应格式正确。
1.6 日志记录
- Info级别:记录所有请求和成功响应
- Error级别:记录所有错误
- Debug级别:记录Token验证等敏感操作的详细信息
二、用户信息Provider(UserProvider)
2.1 功能概述
实现了用户信息和粉丝身份相关的Dubbo-go Provider接口,包括:
- 用户信息查询
- 粉丝档案管理
- 个人信息管理
- 密码管理
- 粉丝身份管理
2.2 实现的方法
用户信息相关:
GetUser- 获取用户信息GetFanProfile- 获取粉丝档案GetCurrentUser- 获取当前登录用户信息GetMyProfile- 获取个人信息页UpdateNickname- 修改昵称UpdatePassword- 修改密码
粉丝身份相关:
GetFanIdentities- 获取可选粉丝身份列表AddIdentity- 新增粉丝身份SwitchIdentity- 切换粉丝身份
Provider接口:
Reference- 返回服务引用名称
2.3 实现要点
-
Context中提取用户信息:
- 需要认证的接口(GetCurrentUser, GetMyProfile, UpdateNickname等)需要从Context中提取userID和starID
- 目前使用
extractUserInfoFromContext辅助函数,该函数需要在认证中间件中设置userID和starID到context
-
Service层调用:
- 直接调用Service层方法
- 对于需要userID/starID的方法,从Context中提取后传递给Service层
-
响应格式转换:
GetCurrentUser需要将GetMyProfileResponse转换为GetCurrentUserResponse格式
2.4 依赖的Service
service.UserService- 用户信息服务service.IdentityService- 粉丝身份服务
2.5 使用示例
// 创建Service实例
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
db := database.GetDB()
userService := service.NewUserService(userRepo, fanProfileRepo, db)
identityService := service.NewIdentityService(fanProfileRepo, starRepo, userRepo, db)
// 创建Provider实例
userProvider := provider.NewUserProvider(userService, identityService)
// 在Dubbo-go中注册Provider
config.SetProviderService(userProvider)
2.6 注意事项
-
认证中间件依赖:
- 需要认证的接口依赖认证中间件从Token中提取userID和starID并设置到Context
extractUserInfoFromContext函数目前返回错误,需要在实现认证中间件后完善
-
Context使用:
- 所有方法都接收
context.Context作为第一个参数 - 需要认证的接口从Context中提取用户信息
- 不需要认证的接口(如GetUser, GetFanProfile)直接使用请求参数
- 所有方法都接收
-
错误处理:
- 捕获Service层错误并转换为proto响应格式
- 确保所有错误都有对应的响应结构
2.7 待完善的功能
- extractUserInfoFromContext函数:需要实现认证中间件后,从Context中正确提取userID和starID
- 方案1:从context.Values中获取(需要中间件设置)
- 方案2:从metadata中获取(Dubbo-go支持)
- 方案3:从请求头中提取Token并解析