117 lines
3.1 KiB
Go
117 lines
3.1 KiB
Go
|
package conf
|
|||
|
|
|||
|
import (
|
|||
|
"ego/internal/cache"
|
|||
|
"ego/internal/conf/locales"
|
|||
|
"ego/internal/util"
|
|||
|
"ego/pkg/logger"
|
|||
|
"fmt"
|
|||
|
"os"
|
|||
|
|
|||
|
"github.com/joho/godotenv"
|
|||
|
"go.uber.org/zap"
|
|||
|
)
|
|||
|
|
|||
|
// Init 初始化所有配置
|
|||
|
func Init() error {
|
|||
|
// 1. 加载环境变量
|
|||
|
if err := loadEnvironmentVariables(); err != nil {
|
|||
|
// 这里不能使用logger,因为还没初始化
|
|||
|
return fmt.Errorf("环境变量加载失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 2. 初始化日志系统(在验证环境变量之前,因为后续步骤需要使用logger)
|
|||
|
if err := logger.BuildLogger(); err != nil {
|
|||
|
// 这里不能使用logger,因为初始化失败了
|
|||
|
return fmt.Errorf("日志系统初始化失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 3. 验证必要环境变量
|
|||
|
if err := validateRequiredEnvVars(); err != nil {
|
|||
|
logger.Error(nil, "环境变量验证失败", zap.Error(err))
|
|||
|
return fmt.Errorf("环境变量验证失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 4. 加载翻译文件
|
|||
|
if err := locales.LoadLocales(); err != nil {
|
|||
|
logger.Error(nil, "翻译文件加载失败", zap.Error(err))
|
|||
|
return fmt.Errorf("翻译文件加载失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 5. 连接数据库
|
|||
|
mysqlDSN := os.Getenv("MYSQL_DSN")
|
|||
|
if err := Database(mysqlDSN); err != nil {
|
|||
|
logger.Error(nil, "数据库初始化失败", zap.Error(err))
|
|||
|
return fmt.Errorf("数据库初始化失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 6. 连接 Redis
|
|||
|
if err := cache.Redis(); err != nil {
|
|||
|
logger.Error(nil, "Redis初始化失败", zap.Error(err))
|
|||
|
return fmt.Errorf("Redis初始化失败: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 7. 输出JWT密钥状态日志(在logger初始化完成后)
|
|||
|
util.LogJwtKeyStatus()
|
|||
|
|
|||
|
logger.Info(nil, "所有配置初始化完成")
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// Close 关闭所有资源
|
|||
|
func Close() {
|
|||
|
logger.Info(nil, "开始关闭应用程序资源...")
|
|||
|
|
|||
|
// 关闭数据库
|
|||
|
if err := closeDatabase(); err != nil {
|
|||
|
logger.Error(nil, "数据库关闭失败", zap.Error(err))
|
|||
|
} else {
|
|||
|
logger.Info(nil, "数据库已关闭")
|
|||
|
}
|
|||
|
|
|||
|
// 关闭 Redis
|
|||
|
if err := cache.Close(); err != nil {
|
|||
|
logger.Error(nil, "Redis关闭失败", zap.Error(err))
|
|||
|
} else {
|
|||
|
logger.Info(nil, "Redis已关闭")
|
|||
|
}
|
|||
|
|
|||
|
logger.Info(nil, "应用程序资源关闭完成")
|
|||
|
}
|
|||
|
|
|||
|
// loadEnvironmentVariables 加载环境变量并处理错误
|
|||
|
func loadEnvironmentVariables() error {
|
|||
|
// 尝试加载.env文件,如果文件不存在也不报错
|
|||
|
if err := godotenv.Load(); err != nil {
|
|||
|
// 只有在文件存在但读取失败时才报错
|
|||
|
if !os.IsNotExist(err) {
|
|||
|
return fmt.Errorf("加载 .env 文件失败: %w", err)
|
|||
|
}
|
|||
|
// .env文件不存在,使用系统环境变量
|
|||
|
logger.Info(nil, ".env 文件不存在,使用系统环境变量")
|
|||
|
} else {
|
|||
|
logger.Info(nil, "成功加载 .env 文件")
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// validateRequiredEnvVars 验证必要的环境变量
|
|||
|
func validateRequiredEnvVars() error {
|
|||
|
requiredVars := map[string]string{
|
|||
|
"MYSQL_DSN": "数据库连接字符串",
|
|||
|
}
|
|||
|
|
|||
|
var missingVars []string
|
|||
|
for envVar, description := range requiredVars {
|
|||
|
if os.Getenv(envVar) == "" {
|
|||
|
missingVars = append(missingVars, fmt.Sprintf("%s (%s)", envVar, description))
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if len(missingVars) > 0 {
|
|||
|
return fmt.Errorf("缺少必要环境变量: %v", missingVars)
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|