| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- package bootstrap
- import (
- "context"
- "fmt"
- "os"
- "os/signal"
- "syscall"
- "dbview/service/internal/common/logger"
- "dbview/service/internal/common/manager/connection"
- "dbview/service/internal/common/manager/storage"
- "dbview/service/internal/common/manager/task"
- "dbview/service/internal/config"
- "go.uber.org/zap"
- )
- // App 应用实例
- type App struct {
- Config *config.AppConfig
- Logger logger.Logger
- AuditLogger logger.AuditLogger
- StorageManager storage.StorageInterface // 使用 StorageInterface 接口
- TaskManager *task.Manager
- ConnectionPool *connection.ConnectionPool
- Context context.Context
- Cancel context.CancelFunc
- }
- // InitializeApp 初始化应用
- func InitializeApp(configPath string) (*App, error) {
- ctx, cancel := context.WithCancel(context.Background())
- app := &App{
- Context: ctx,
- Cancel: cancel,
- }
- // 1. 加载配置
- cfg, err := loadConfig(configPath)
- if err != nil {
- cancel()
- return nil, fmt.Errorf("加载配置文件失败,配置文件路径: %s,错误: %v", configPath, err)
- }
- app.Config = cfg
- // 2. 初始化日志系统
- appLogger, err := initializeLogger(cfg)
- if err != nil {
- cancel()
- return nil, fmt.Errorf("初始化日志系统失败,错误: %v", err)
- }
- app.Logger = appLogger
- // 3. 初始化审计系统
- auditLogger, err := initializeAuditLogger(cfg)
- if err != nil {
- app.Logger.Error("初始化审计系统失败", zap.Error(err))
- cancel()
- return nil, fmt.Errorf("初始化审计日志系统失败,错误: %v", err)
- }
- app.AuditLogger = auditLogger
- // 4. 初始化存储系统
- storageMgr, err := initializeStorage(cfg)
- if err != nil {
- app.Logger.Error("初始化存储系统失败", zap.Error(err))
- cancel()
- return nil, fmt.Errorf("初始化存储管理系统失败,存储类型: %s,错误: %v", cfg.Storage.Type, err)
- }
- app.StorageManager = storageMgr
- // 5. 注册数据库驱动
- if err := registerDatabaseDrivers(); err != nil {
- app.Logger.Error("注册数据库驱动失败", zap.Error(err))
- cancel()
- return nil, fmt.Errorf("注册数据库驱动失败,错误: %v", err)
- }
- // 6. 初始化连接池
- connPool := initializeConnectionPool(ctx, appLogger)
- app.ConnectionPool = connPool
- // 7. 初始化任务管理器
- taskManager := initializeTaskManager(ctx)
- app.TaskManager = taskManager
- // 8. 记录启动信息
- app.Logger.Info("应用初始化完成",
- zap.String("config_path", configPath),
- zap.Bool("audit_enabled", cfg.Audit.Enabled),
- zap.String("storage_type", cfg.Storage.Type),
- )
- return app, nil
- }
- // initializeLogger 初始化日志系统
- func initializeLogger(cfg *config.AppConfig) (logger.Logger, error) {
- return logger.NewLogger(
- logger.WithLevel(cfg.Log.GetLogLevel()),
- logger.WithDevelopment(cfg.Log.Development),
- logger.WithEncoding(cfg.Log.Encoding),
- logger.WithOutputPaths(cfg.Log.OutputPaths...),
- )
- }
- // initializeAuditLogger 初始化审计日志系统
- func initializeAuditLogger(cfg *config.AppConfig) (logger.AuditLogger, error) {
- return logger.NewAuditLogger(
- logger.WithEnabled(cfg.Audit.Enabled),
- logger.WithDatabasePath(cfg.Audit.DatabasePath),
- logger.WithRetention(cfg.Audit.RetentionDays),
- logger.WithBufferSize(cfg.Audit.BufferSize),
- )
- }
- // initializeStorage 初始化存储系统
- func initializeStorage(cfg *config.AppConfig) (storage.StorageInterface, error) {
- // 检查数据库文件是否已存在
- var dbExists bool
- if cfg.Storage.Type == "db" {
- if _, err := os.Stat(cfg.Storage.DatabasePath); err == nil {
- dbExists = true
- }
- }
- var storageMgr storage.StorageInterface
- var err error
- switch cfg.Storage.Type {
- case "db":
- storageMgr, err = storage.NewDBStorage(cfg.Storage.DatabasePath)
- if err != nil {
- return nil, err
- }
- // 只有在数据库文件不存在时才调用CreateDefaultConfig
- if !dbExists {
- if err := storageMgr.CreateDefaultConfig(); err != nil {
- return nil, fmt.Errorf("创建默认配置失败: %v", err)
- }
- }
- return storageMgr, nil
- default:
- return nil, fmt.Errorf("不支持的存储类型: %s,可用类型: file, db", cfg.Storage.Type)
- }
- }
- // registerDatabaseDrivers 注册数据库驱动
- func registerDatabaseDrivers() error {
- // 这里可以注册各种数据库驱动
- // 目前暂时返回 nil,具体实现根据需要添加
- return nil
- }
- // initializeConnectionPool 初始化连接池
- func initializeConnectionPool(ctx context.Context, log logger.Logger) *connection.ConnectionPool {
- pool := connection.NewConnectionPool(ctx)
- if log != nil {
- log.Info("数据库连接池初始化完成")
- }
- return pool
- }
- // initializeTaskManager 初始化任务管理器
- func initializeTaskManager(ctx context.Context) *task.Manager {
- return task.NewManager(ctx, 5)
- }
- // loadConfig 加载配置文件,如果不存在则创建默认配置
- func loadConfig(configPath string) (*config.AppConfig, error) {
- cfg, err := config.LoadConfig(configPath)
- if err != nil {
- return nil, err
- }
- // 设置默认值
- cfg.SetDefaults()
- return cfg, nil
- }
- // Shutdown 优雅关闭应用
- func (app *App) Shutdown() error {
- app.Logger.Info("开始关闭应用")
- // 取消上下文
- app.Cancel()
- // 关闭连接池
- if app.ConnectionPool != nil {
- if err := app.ConnectionPool.CloseAllConnections(); err != nil {
- app.Logger.Warn("关闭连接池失败", zap.Error(err))
- }
- }
- // 关闭存储管理器
- if app.StorageManager != nil {
- if closer, ok := app.StorageManager.(interface{ Close() error }); ok {
- if err := closer.Close(); err != nil {
- app.Logger.Warn("关闭存储管理器失败", zap.Error(err))
- }
- }
- }
- // 关闭任务管理器
- if app.TaskManager != nil {
- app.TaskManager.Shutdown()
- }
- // 同步日志
- if app.Logger != nil {
- app.Logger.Sync()
- }
- if app.AuditLogger != nil {
- app.AuditLogger.Sync()
- }
- app.Logger.Info("应用已关闭")
- return nil
- }
- // Run 运行应用
- func (app *App) Run() error {
- app.Logger.Info("应用开始运行")
- // 设置信号处理
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
- // 等待信号
- select {
- case sig := <-sigChan:
- app.Logger.Info("收到信号,开始关闭", zap.String("signal", sig.String()))
- return app.Shutdown()
- case <-app.Context.Done():
- app.Logger.Info("上下文取消,开始关闭")
- return app.Shutdown()
- }
- }
|