bootstrap.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package bootstrap
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "dbview/service/internal/common/logger"
  9. "dbview/service/internal/common/manager/connection"
  10. "dbview/service/internal/common/manager/storage"
  11. "dbview/service/internal/common/manager/task"
  12. "dbview/service/internal/config"
  13. "go.uber.org/zap"
  14. )
  15. // App 应用实例
  16. type App struct {
  17. Config *config.AppConfig
  18. Logger logger.Logger
  19. AuditLogger logger.AuditLogger
  20. StorageManager storage.StorageInterface // 使用 StorageInterface 接口
  21. TaskManager *task.Manager
  22. ConnectionPool *connection.ConnectionPool
  23. Context context.Context
  24. Cancel context.CancelFunc
  25. }
  26. // InitializeApp 初始化应用
  27. func InitializeApp(configPath string) (*App, error) {
  28. ctx, cancel := context.WithCancel(context.Background())
  29. app := &App{
  30. Context: ctx,
  31. Cancel: cancel,
  32. }
  33. // 1. 加载配置
  34. cfg, err := loadConfig(configPath)
  35. if err != nil {
  36. cancel()
  37. return nil, fmt.Errorf("加载配置文件失败,配置文件路径: %s,错误: %v", configPath, err)
  38. }
  39. app.Config = cfg
  40. // 2. 初始化日志系统
  41. appLogger, err := initializeLogger(cfg)
  42. if err != nil {
  43. cancel()
  44. return nil, fmt.Errorf("初始化日志系统失败,错误: %v", err)
  45. }
  46. app.Logger = appLogger
  47. // 3. 初始化审计系统
  48. auditLogger, err := initializeAuditLogger(cfg)
  49. if err != nil {
  50. app.Logger.Error("初始化审计系统失败", zap.Error(err))
  51. cancel()
  52. return nil, fmt.Errorf("初始化审计日志系统失败,错误: %v", err)
  53. }
  54. app.AuditLogger = auditLogger
  55. // 4. 初始化存储系统
  56. storageMgr, err := initializeStorage(cfg)
  57. if err != nil {
  58. app.Logger.Error("初始化存储系统失败", zap.Error(err))
  59. cancel()
  60. return nil, fmt.Errorf("初始化存储管理系统失败,存储类型: %s,错误: %v", cfg.Storage.Type, err)
  61. }
  62. app.StorageManager = storageMgr
  63. // 5. 注册数据库驱动
  64. if err := registerDatabaseDrivers(); err != nil {
  65. app.Logger.Error("注册数据库驱动失败", zap.Error(err))
  66. cancel()
  67. return nil, fmt.Errorf("注册数据库驱动失败,错误: %v", err)
  68. }
  69. // 6. 初始化连接池
  70. connPool := initializeConnectionPool(ctx, appLogger)
  71. app.ConnectionPool = connPool
  72. // 7. 初始化任务管理器
  73. taskManager := initializeTaskManager(ctx)
  74. app.TaskManager = taskManager
  75. // 8. 记录启动信息
  76. app.Logger.Info("应用初始化完成",
  77. zap.String("config_path", configPath),
  78. zap.Bool("audit_enabled", cfg.Audit.Enabled),
  79. zap.String("storage_type", cfg.Storage.Type),
  80. )
  81. return app, nil
  82. }
  83. // initializeLogger 初始化日志系统
  84. func initializeLogger(cfg *config.AppConfig) (logger.Logger, error) {
  85. return logger.NewLogger(
  86. logger.WithLevel(cfg.Log.GetLogLevel()),
  87. logger.WithDevelopment(cfg.Log.Development),
  88. logger.WithEncoding(cfg.Log.Encoding),
  89. logger.WithOutputPaths(cfg.Log.OutputPaths...),
  90. )
  91. }
  92. // initializeAuditLogger 初始化审计日志系统
  93. func initializeAuditLogger(cfg *config.AppConfig) (logger.AuditLogger, error) {
  94. return logger.NewAuditLogger(
  95. logger.WithEnabled(cfg.Audit.Enabled),
  96. logger.WithDatabasePath(cfg.Audit.DatabasePath),
  97. logger.WithRetention(cfg.Audit.RetentionDays),
  98. logger.WithBufferSize(cfg.Audit.BufferSize),
  99. )
  100. }
  101. // initializeStorage 初始化存储系统
  102. func initializeStorage(cfg *config.AppConfig) (storage.StorageInterface, error) {
  103. // 检查数据库文件是否已存在
  104. var dbExists bool
  105. if cfg.Storage.Type == "db" {
  106. if _, err := os.Stat(cfg.Storage.DatabasePath); err == nil {
  107. dbExists = true
  108. }
  109. }
  110. var storageMgr storage.StorageInterface
  111. var err error
  112. switch cfg.Storage.Type {
  113. case "db":
  114. storageMgr, err = storage.NewDBStorage(cfg.Storage.DatabasePath)
  115. if err != nil {
  116. return nil, err
  117. }
  118. // 只有在数据库文件不存在时才调用CreateDefaultConfig
  119. if !dbExists {
  120. if err := storageMgr.CreateDefaultConfig(); err != nil {
  121. return nil, fmt.Errorf("创建默认配置失败: %v", err)
  122. }
  123. }
  124. return storageMgr, nil
  125. default:
  126. return nil, fmt.Errorf("不支持的存储类型: %s,可用类型: file, db", cfg.Storage.Type)
  127. }
  128. }
  129. // registerDatabaseDrivers 注册数据库驱动
  130. func registerDatabaseDrivers() error {
  131. // 这里可以注册各种数据库驱动
  132. // 目前暂时返回 nil,具体实现根据需要添加
  133. return nil
  134. }
  135. // initializeConnectionPool 初始化连接池
  136. func initializeConnectionPool(ctx context.Context, log logger.Logger) *connection.ConnectionPool {
  137. pool := connection.NewConnectionPool(ctx)
  138. if log != nil {
  139. log.Info("数据库连接池初始化完成")
  140. }
  141. return pool
  142. }
  143. // initializeTaskManager 初始化任务管理器
  144. func initializeTaskManager(ctx context.Context) *task.Manager {
  145. return task.NewManager(ctx, 5)
  146. }
  147. // loadConfig 加载配置文件,如果不存在则创建默认配置
  148. func loadConfig(configPath string) (*config.AppConfig, error) {
  149. cfg, err := config.LoadConfig(configPath)
  150. if err != nil {
  151. return nil, err
  152. }
  153. // 设置默认值
  154. cfg.SetDefaults()
  155. return cfg, nil
  156. }
  157. // Shutdown 优雅关闭应用
  158. func (app *App) Shutdown() error {
  159. app.Logger.Info("开始关闭应用")
  160. // 取消上下文
  161. app.Cancel()
  162. // 关闭连接池
  163. if app.ConnectionPool != nil {
  164. if err := app.ConnectionPool.CloseAllConnections(); err != nil {
  165. app.Logger.Warn("关闭连接池失败", zap.Error(err))
  166. }
  167. }
  168. // 关闭存储管理器
  169. if app.StorageManager != nil {
  170. if closer, ok := app.StorageManager.(interface{ Close() error }); ok {
  171. if err := closer.Close(); err != nil {
  172. app.Logger.Warn("关闭存储管理器失败", zap.Error(err))
  173. }
  174. }
  175. }
  176. // 关闭任务管理器
  177. if app.TaskManager != nil {
  178. app.TaskManager.Shutdown()
  179. }
  180. // 同步日志
  181. if app.Logger != nil {
  182. app.Logger.Sync()
  183. }
  184. if app.AuditLogger != nil {
  185. app.AuditLogger.Sync()
  186. }
  187. app.Logger.Info("应用已关闭")
  188. return nil
  189. }
  190. // Run 运行应用
  191. func (app *App) Run() error {
  192. app.Logger.Info("应用开始运行")
  193. // 设置信号处理
  194. sigChan := make(chan os.Signal, 1)
  195. signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
  196. // 等待信号
  197. select {
  198. case sig := <-sigChan:
  199. app.Logger.Info("收到信号,开始关闭", zap.String("signal", sig.String()))
  200. return app.Shutdown()
  201. case <-app.Context.Done():
  202. app.Logger.Info("上下文取消,开始关闭")
  203. return app.Shutdown()
  204. }
  205. }