90 lines
2.5 KiB
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
|
|
}
|