Files
nl-im-websocket-demo/main.go
2025-07-16 10:33:59 +08:00

126 lines
2.8 KiB
Go

package main
import (
"flag"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
"os"
"runtime/debug"
"time"
"xk-websocket/controller"
"xk-websocket/route"
"xk-websocket/utils"
"github.com/gin-gonic/gin"
)
func ensureLogDir(logDir string) {
if _, err := os.Stat(logDir); os.IsNotExist(err) {
log.Printf("📂 日志目录不存在,正在创建: %s", logDir)
if err := os.MkdirAll(logDir, 0755); err != nil {
log.Fatalf("❌ 无法创建日志目录: %v", err)
}
log.Printf("✅ 日志目录创建成功: %s", logDir)
}
}
func setupLogger() {
// 设置日志目录(优先级:环境变量 > 默认值)
logDir := os.Getenv("LOG_DIR")
if logDir == "" {
logDir = "logs" // 默认日志目录
}
// 确保日志目录存在
ensureLogDir(logDir)
// 设置日志轮转频率
logFreq := os.Getenv("LOG_ROTATE_FREQ")
if logFreq == "" {
logFreq = "daily" // 默认每天轮转
}
// 创建文件日志写入器
logger := log.Default()
fileWriter := utils.NewDailyFileWriter(logDir, logFreq, logger, "xk-websocket")
// 同时输出到控制台和文件
log.SetOutput(fileWriter)
}
// 初始化数据库连接
func initDB() *gorm.DB {
dsn := utils.GetEnv("DB_DSN", "root:password@tcp(localhost:3306)/xk_chat?charset=utf8mb4&parseTime=True&loc=Local")
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("❌ 数据库连接失败: %v", err)
}
//// 自动迁移表结构
//if err := db.AutoMigrate(&models.XkChatMessage{}); err != nil {
// log.Fatalf("❌ 数据库迁移失败: %v", err)
//}
log.Println("✅ 数据库连接成功")
return db
}
func main() {
// 初始化日志系统(必须放在最先)
setupLogger()
defer func() {
if r := recover(); r != nil {
log.Printf("❌ 程序崩溃: %v", r)
debug.PrintStack()
log.Println("程序将在10秒后退出...")
time.Sleep(10 * time.Second)
}
}()
log.Println("🚀 启动 WebSocket 服务...")
// 添加命令行参数解析
var port, nodeID string
flag.StringVar(&port, "port", "", "运行端口号")
flag.StringVar(&nodeID, "nodeId", "", "节点标识符")
flag.Parse()
// 初始化数据库
db := initDB()
// 初始化控制器
wsCtrl := controller.NewWebSocketController(db)
// 设置参数优先级
if nodeID != "" {
wsCtrl.NodeID = nodeID
}
if port != "" {
wsCtrl.Port = port
}
// 配置系统
wsCtrl.ConfigureSystem()
wsCtrl.InitRedisClient()
wsCtrl.PrintStartupInfo()
// 创建Gin路由器
router := gin.Default()
// 设置路由
route.SetupRoutes(router, wsCtrl)
// 启动Redis消息订阅
go wsCtrl.SubscribeToRedis()
// 启动HTTP服务
addr := "0.0.0.0:" + wsCtrl.Port
log.Printf("🌐 监听地址: %s", addr)
log.Printf("🔌 WebSocket连接地址: ws://%s/ws", addr)
if err := router.Run(addr); err != nil {
log.Fatalf("❌ 服务启动失败: %v", err)
}
}