// package server package main import ( "context" "flag" "fmt" "log" "net/http" "os" "os/signal" "syscall" "git.kingecg.top/kingecg/gomog/internal/config" "git.kingecg.top/kingecg/gomog/internal/database" "git.kingecg.top/kingecg/gomog/internal/database/dm8" "git.kingecg.top/kingecg/gomog/internal/database/postgres" "git.kingecg.top/kingecg/gomog/internal/database/sqlite" "git.kingecg.top/kingecg/gomog/internal/engine" gomogHttp "git.kingecg.top/kingecg/gomog/internal/protocol/http" "git.kingecg.top/kingecg/gomog/internal/protocol/tcp" ) func main() { // 解析命令行参数 configPath := flag.String("config", "config.yaml", "配置文件路径") showVersion := flag.Bool("version", false, "显示版本信息") flag.Parse() if *showVersion { fmt.Println("Gomog Server v1.0.0") os.Exit(0) } // 加载配置 cfg, err := loadConfig(*configPath) if err != nil { log.Fatalf("Failed to load config: %v", err) } // 验证配置 if err := cfg.Validate(); err != nil { log.Fatalf("Invalid config: %v", err) } // 创建数据库适配器 adapter, err := createDatabaseAdapter(cfg.Database.Type) if err != nil { log.Fatalf("Failed to create database adapter: %v", err) } // 连接数据库 ctx := context.Background() if err := adapter.Connect(ctx, cfg.Database.DSN); err != nil { log.Fatalf("Failed to connect to database: %v", err) } defer adapter.Close() // 设置连接池 // TODO: 实现连接池配置 log.Printf("Connected to %s database", cfg.Database.Type) // 创建内存存储 store := engine.NewMemoryStore(adapter) // 创建 CRUD 处理器 crud := engine.NewCRUDHandler(store, adapter) // 创建聚合引擎 agg := engine.NewAggregationEngine(store) // 创建 HTTP 服务器 var httpServer *gomogHttp.HTTPServer if cfg.Server.HTTPAddr != "" { httpHandler := gomogHttp.NewRequestHandler(store, crud, agg) httpServer = gomogHttp.NewHTTPServer(cfg.Server.HTTPAddr, httpHandler) log.Printf("Starting HTTP server on %s", cfg.Server.HTTPAddr) } // 创建 TCP 服务器 var tcpServer *tcp.TCPServer if cfg.Server.TCPAddr != "" { tcpHandler := tcp.NewMessageHandler(store, crud, agg) tcpServer, err = tcp.NewTCPServer(cfg.Server.TCPAddr, tcpHandler) if err != nil { log.Fatalf("Failed to create TCP server: %v", err) } log.Printf("Starting TCP server on %s", cfg.Server.TCPAddr) } // 启动服务器 if httpServer != nil { go func() { if err := httpServer.Start(); err != nil && err != http.ErrServerClosed { log.Fatalf("HTTP server error: %v", err) } }() } if tcpServer != nil { if err := tcpServer.Start(); err != nil { log.Fatalf("TCP server error: %v", err) } } log.Println("Gomog server started successfully") // 等待退出信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") // 优雅关闭 if httpServer != nil { httpServer.Shutdown(context.Background()) } if tcpServer != nil { tcpServer.Stop() } log.Println("Server stopped") } // loadConfig 加载配置 func loadConfig(path string) (*config.Config, error) { if _, err := os.Stat(path); os.IsNotExist(err) { // 配置文件不存在,使用默认配置 log.Printf("Config file not found, using default config") return config.DefaultConfig(), nil } return config.Load(path) } // createDatabaseAdapter 创建数据库适配器 func createDatabaseAdapter(dbType string) (database.DatabaseAdapter, error) { switch dbType { case "sqlite": return sqlite.NewSQLiteAdapter(), nil case "postgres": return postgres.NewPostgresAdapter(), nil case "dm8": return dm8.NewDM8Adapter(), nil default: return nil, fmt.Errorf("unsupported database type: %s", dbType) } }