package httpserver import ( "auth-server/service" "context" "fmt" "log/slog" "net/http" "os" "os/signal" "strings" "time" ) import ( "github.com/gin-gonic/gin" "github.com/spf13/cobra" ) import ( "auth-server/common" "auth-server/logger" "auth-server/models" "auth-server/router" _ "auth-server/service" ) var ( configFolder string addr string mode string StartCmd = &cobra.Command{ Use: "run", Short: "Start API server", Example: "auth-server run -c config/config.toml", SilenceUsage: true, PreRun: func(cmd *cobra.Command, args []string) { setup() }, RunE: func(cmd *cobra.Command, args []string) error { return run() }, } ) func init() { StartCmd.Flags().StringVarP(&configFolder, "config", "c", "config/", "Start server with provided configuration folder") StartCmd.Flags().StringVarP(&addr, "addr", "a", "0.0.0.0:6001", "Tcp server listening on") StartCmd.Flags().StringVarP(&mode, "mode", "m", "debug", "server mode ; eg:debug,test,release") } func setup() { if strings.HasSuffix(configFolder, "/") { configFolder = configFolder[:len(configFolder)-1] if strings.HasSuffix(configFolder, "/") { panic("invalid config folder") } } configToml := configFolder + "/config.toml" //1. 读取配置 common.SetupConfig(configToml, addr, mode) //2. 设置日志 logger.SetupLogger(true) //3. 初始化gorm models.SetupGorm(true) //4. 初始化i18n common.SetupTrans() //5. 初始化service service.ResourceService.Setup() slog.Info(`starting api server`, "pid", os.Getpid()) } func run() error { gin.SetMode(common.BasicConfig.Mode) r := router.InitRouter() srv := &http.Server{ Addr: common.ServerConfig.Auth, Handler: r, } go func() { // 服务连接 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { slog.Error("listen: ", err) panic("http server closed") } }() slog.Info("module: " + common.Module) slog.Info("desc: " + common.Desc) slog.Info("version: " + common.Version) slog.Info("build: " + common.Build) slog.Info(fmt.Sprintf("Server run at: %s", common.Now())) slog.Info(fmt.Sprintf("- Network: http://%s/ \n", common.ServerConfig.Auth)) slog.Info("Enter Control + C Shutdown Server \n") // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间) quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit fmt.Printf("%s Shutdown Server ... \n", common.Now()) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { slog.Error("Server Shutdown:", "err", err) } slog.Info("Server exiting") logger.ShutdownLogger() return nil }