gomog/cmd/server/main.go

151 lines
3.7 KiB
Go

// 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)
}
}