|
@@ -0,0 +1,121 @@
|
|
|
+// 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()
|
|
|
+}
|