bootstrap.go 6.3 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/common/mcp"
  13. "dbview/service/internal/config"
  14. "go.uber.org/zap"
  15. )
  16. // App 应用实例
  17. type App struct {
  18. Config *config.AppConfig
  19. Logger logger.Logger
  20. AuditLogger logger.AuditLogger
  21. StorageManager storage.StorageInterface // 使用 StorageInterface 接口
  22. TaskManager *task.Manager
  23. ConnectionPool *connection.ConnectionPool
  24. MCP *mcp.Component
  25. Context context.Context
  26. Cancel context.CancelFunc
  27. }
  28. // InitializeApp 初始化应用
  29. func InitializeApp(configPath string) (*App, error) {
  30. ctx, cancel := context.WithCancel(context.Background())
  31. app := &App{
  32. Context: ctx,
  33. Cancel: cancel,
  34. }
  35. // 1. 加载配置
  36. cfg, err := loadConfig(configPath)
  37. if err != nil {
  38. cancel()
  39. return nil, fmt.Errorf("加载配置文件失败,配置文件路径: %s,错误: %v", configPath, err)
  40. }
  41. app.Config = cfg
  42. // 2. 初始化日志系统
  43. appLogger, err := initializeLogger(cfg)
  44. if err != nil {
  45. cancel()
  46. return nil, fmt.Errorf("初始化日志系统失败,错误: %v", err)
  47. }
  48. app.Logger = appLogger
  49. // 3. 初始化审计系统
  50. auditLogger, err := initializeAuditLogger(cfg)
  51. if err != nil {
  52. app.Logger.Error("初始化审计系统失败", zap.Error(err))
  53. cancel()
  54. return nil, fmt.Errorf("初始化审计日志系统失败,错误: %v", err)
  55. }
  56. app.AuditLogger = auditLogger
  57. // 4. 初始化存储系统
  58. storageMgr, err := initializeStorage(cfg)
  59. if err != nil {
  60. app.Logger.Error("初始化存储系统失败", zap.Error(err))
  61. cancel()
  62. return nil, fmt.Errorf("初始化存储管理系统失败,存储类型: %s,错误: %v", cfg.Storage.Type, err)
  63. }
  64. app.StorageManager = storageMgr
  65. // 5. 注册数据库驱动
  66. // if err := registerDatabaseDrivers(); err != nil {
  67. // app.Logger.Error("注册数据库驱动失败", zap.Error(err))
  68. // cancel()
  69. // return nil, fmt.Errorf("注册数据库驱动失败,错误: %v", err)
  70. // }
  71. // 6. 初始化连接池
  72. connPool := initializeConnectionPool(ctx, appLogger)
  73. app.ConnectionPool = connPool
  74. // 7. 初始化任务管理器
  75. taskManager := initializeTaskManager(ctx)
  76. app.TaskManager = taskManager
  77. // 8. 初始化 MCP 组件(按配置开关)
  78. mcpComponent := initializeMCP(ctx, cfg, appLogger, storageMgr, connPool, taskManager)
  79. app.MCP = mcpComponent
  80. // 9. 记录启动信息
  81. app.Logger.Info("应用初始化完成",
  82. zap.String("config_path", configPath),
  83. zap.Bool("audit_enabled", cfg.Audit.Enabled),
  84. zap.String("storage_type", cfg.Storage.Type),
  85. zap.Bool("mcp_enabled", cfg.MCP.Enable),
  86. )
  87. return app, nil
  88. }
  89. // initializeLogger 初始化日志系统
  90. func initializeLogger(cfg *config.AppConfig) (logger.Logger, error) {
  91. return logger.NewLogger(
  92. logger.WithLevel(cfg.Log.GetLogLevel()),
  93. logger.WithDevelopment(cfg.Log.Development),
  94. logger.WithEncoding(cfg.Log.Encoding),
  95. logger.WithOutputPaths(cfg.Log.OutputPaths...),
  96. )
  97. }
  98. // initializeAuditLogger 初始化审计日志系统
  99. func initializeAuditLogger(cfg *config.AppConfig) (logger.AuditLogger, error) {
  100. return logger.NewAuditLogger(
  101. logger.WithEnabled(cfg.Audit.Enabled),
  102. logger.WithDatabasePath(cfg.Audit.DatabasePath),
  103. logger.WithRetention(cfg.Audit.RetentionDays),
  104. logger.WithBufferSize(cfg.Audit.BufferSize),
  105. )
  106. }
  107. // initializeStorage 初始化存储系统
  108. func initializeStorage(cfg *config.AppConfig) (storage.StorageInterface, error) {
  109. // 检查数据库文件是否已存在
  110. var dbExists bool
  111. if cfg.Storage.Type == "db" {
  112. if _, err := os.Stat(cfg.Storage.DatabasePath); err == nil {
  113. dbExists = true
  114. }
  115. }
  116. var storageMgr storage.StorageInterface
  117. var err error
  118. switch cfg.Storage.Type {
  119. case "db":
  120. storageMgr, err = storage.NewDBStorage(cfg.Storage.DatabasePath)
  121. if err != nil {
  122. return nil, err
  123. }
  124. // 只有在数据库文件不存在时才调用CreateDefaultConfig
  125. if !dbExists {
  126. if err := storageMgr.CreateDefaultConfig(); err != nil {
  127. return nil, fmt.Errorf("创建默认配置失败: %v", err)
  128. }
  129. }
  130. return storageMgr, nil
  131. default:
  132. return nil, fmt.Errorf("不支持的存储类型: %s,可用类型: db", cfg.Storage.Type)
  133. }
  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. }