go-kratos/app/ucenter/internal/data/data.go

90 lines
2.5 KiB
Go

package data
import (
"context"
"ky-go-kratos/app/ucenter/internal/conf"
"ky-go-kratos/app/ucenter/internal/data/ent"
"ky-go-kratos/pkg/database"
"github.com/go-kratos/kratos/v2/log"
"github.com/google/wire"
"github.com/redis/go-redis/v9"
"go.mongodb.org/mongo-driver/mongo"
)
var ProviderSet = wire.NewSet(NewData, NewUserRepo)
type Data struct {
// TODO wrapped database client
Redis *redis.Client // 通用缓存
Session *redis.Client // 会话
Queue *redis.Client // 队列
Lock *redis.Client // 分布式锁
Task *redis.Client // 任务调度/异步处理
Mongo *mongo.Database // MongoDB
Ent *ent.Client // Mysql
}
// NewData
func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) {
logHelper := log.NewHelper(logger)
// Redis
RedisClient := database.NewRedis(c.Redis.Source, 0)
SessionClient := database.NewRedis(c.Redis.Source, 1)
QueueClient := database.NewRedis(c.Redis.Source, 2)
LockClient := database.NewRedis(c.Redis.Source, 3)
TaskClient := database.NewRedis(c.Redis.Source, 4)
// MongoDB
mongoClient := database.NewMongoDB(c.Mongodb.Uri, c.Mongodb.Db)
// MySQL
db := database.OpenMysql(c.Database.Source)
entClient := ent.NewClient(ent.Driver(db))
// 创建数据库表结构
if err := entClient.Schema.Create(context.Background()); err != nil {
logHelper.Errorf("failed to close ent client: %v", err)
}
cleanup := func() {
log.NewHelper(logger).Info("closing the data resources")
// 关闭 Redis 客户端
if err := RedisClient.Close(); err != nil {
logHelper.Errorf("failed to close redis client: %v", err)
}
if err := SessionClient.Close(); err != nil {
logHelper.Errorf("failed to close redis client: %v", err)
}
if err := QueueClient.Close(); err != nil {
logHelper.Errorf("failed to close redis client: %v", err)
}
if err := LockClient.Close(); err != nil {
logHelper.Errorf("failed to close redis client: %v", err)
}
if err := TaskClient.Close(); err != nil {
logHelper.Errorf("failed to close redis client: %v", err)
}
// 关闭 MongoDB 连接
if err := mongoClient.Client().Disconnect(context.Background()); err != nil {
logHelper.Errorf("failed to close mongodb connection: %v", err)
}
// 关闭 Ent 客户端
if err := entClient.Close(); err != nil {
logHelper.Errorf("failed to close ent client: %v", err)
}
}
return &Data{
Redis: RedisClient,
Session: SessionClient,
Queue: QueueClient,
Lock: LockClient,
Task: TaskClient,
Mongo: mongoClient,
Ent: entClient,
}, cleanup, nil
}