// sharesrv.main 分享主服务入口 package main import ( "context" "fmt" "net/http" "os" "os/signal" "share/internal/funcaward" "syscall" "time" "share/config" "share/docs/srv/docs" "share/internal/event" "share/internal/prometheus" "share/internal/share" "share/internal/utils" "share/pkg/db" "share/pkg/log" "git.jiaxianghudong.com/yunfan/yunfan" "github.com/pkg/errors" ) var ( Version = "0.0.1" BuildTime string ) // @title 家乡互动 Share API // @version 0.1 // @description 家乡互动分享服务 // @BasePath /share/v2 // @host localhost:9091 func main() { log.Infow("", "Version", Version, "BuildTime", BuildTime) // 初始化Mysql cfgMysql := config.GetMysql() if err := db.Init(cfgMysql.Addr, cfgMysql.UserName, cfgMysql.Password, db.DB(cfgMysql.Db...), db.MaxIdle(cfgMysql.MaxIdle), db.MaxCons(cfgMysql.MaxOpen), db.ParseTime()); err != nil { log.Error(errors.WithMessage(err, "init mysql failed")) return } // 服务退出前,释放数据库资源 defer db.Close() event.WatchEvent() // 道具服务连接 share.ConnPropSrv() // 初始化分享埋点配置 funcaward.InitAwards() httpPort := config.HTTPPort() mode := config.RunMode() if mode == "debug" { docs.SwaggerInfo.Host = fmt.Sprintf("%s:%d", utils.GetInternalIP(), httpPort) //docs.SwaggerInfo.Host = fmt.Sprintf("%s:%d", "192.168.14.117", httpPort) docs.SwaggerInfo.Version = Version } prometheus.Init("yunfan", config.GetName(), mode, utils.GetInternalIP()) // 有设置RPC端口,则运行RPC服务 if config.GetRPCPort() != 0 { go func() { if err := share.RunRPC(); err != nil && err != yunfan.ErrShutdown { log.Error(errors.WithMessage(err, "server run rpc failed")) os.Exit(1) return } }() } // 有设置HTTP端口, 则运行HTTP服务 if httpPort != 0 { // 启动服务监听 go func(port int, mode string) { if err := share.RunHttp(port, mode); err != nil && err != http.ErrServerClosed { log.Error(errors.WithMessage(err, "server run http failed")) os.Exit(1) return } }(httpPort, mode) } log.Infof("server[%s] serving on port:%d", mode, httpPort) waitStop() } // waitStop 等待服务停止 func waitStop() { // 捕捉退出信号 sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP) s := <-sig log.Infof("receive signal:%d , server stopping ...", s) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := share.Stop(ctx); err != nil { log.Error(errors.Wrap(err, "server stop failed")) return } log.Info("server exited") _ = log.Sync() }