151 lines
3.7 KiB
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)
|
|
}
|
|
}
|