package main import ( "log" "net/http" "os" "os/signal" "syscall" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/middleware" "git.x2erp.com/qdy/go-base/myservice" "git.x2erp.com/qdy/go-db/factory/database" "git.x2erp.com/qdy/go-db/myhandle" "git.x2erp.com/qdy/go-svc-agent/functions" "go-micro.dev/v4/web" ) func main() { cfg, err := config.GetConfig() if err != nil { log.Printf("failed to load config: %v", err) return } serviceConfig := cfg.GetService() log.Printf("Service Port: %d", serviceConfig.Port) log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout) log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout) log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout) log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies) log.Printf("Using database type: %s", cfg.GetDatabase().Type) log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port) log.Printf("Database name: %s", cfg.GetDatabase().Database) log.Println("Database connection test passed!") // 启动微服务 startMicroService(cfg) } // 启动微服务 func startMicroService(cfg config.IConfig) { serviceConfig := cfg.GetService() // 初始化数据库 dbFactory, err := database.GetDBFactory() if err != nil { log.Fatalf("Failed to create DB factory: %v", err) } defer func() { if err := dbFactory.Close(); err != nil { log.Printf("Database close error: %v", err) } }() // 设置优雅关闭 setupGracefulShutdown(dbFactory) webService := myservice.StartStandalone(cfg) // 注册HTTP路由到webService registerRoutes(webService, dbFactory) // 等待服务运行 log.Printf("Service started successfully") log.Printf(" • Service: %s", serviceConfig.ServiceName) log.Printf(" • Port: %d", serviceConfig.Port) log.Printf(" • Mode: %s", getServiceMode(cfg)) // 保持主程序运行 select {} } // 判断是否使用注册中心 func shouldUseRegistry(cfg config.IConfig) bool { microConfig := cfg.GetMicro() // 如果有配置注册中心地址且不为空,则使用注册中心 return microConfig.RegistryAddress != "" } // 获取服务模式描述 func getServiceMode(cfg config.IConfig) string { if shouldUseRegistry(cfg) { return "With Service Discovery" } return "Standalone" } // 注册所有路由 func registerRoutes(webService web.Service, dbFactory *database.DBFactory) { // 查询接口 - JSON webService.Handle("/api/query/json", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { myhandle.QueryHandlerJson(w, r, dbFactory, functions.QueryToJSON) }))) // 查询接口 - CSV webService.Handle("/api/query/csv", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryToCSV) }))) // 查询接口 - CSV with positional params webService.Handle("/api/query/csv/param", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryPositionalToCSV) }))) } // 设置优雅关闭 func setupGracefulShutdown(dbFactory *database.DBFactory) { signalCh := make(chan os.Signal, 1) signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM) go func() { <-signalCh log.Println("\nReceived shutdown signal, closing database connection...") if err := dbFactory.Close(); err != nil { log.Printf("Error closing database: %v", err) } log.Println("Database connection closed gracefully") os.Exit(0) }() }