sharesrv.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // sharesrv.main 分享主服务入口
  2. package main
  3. import (
  4. "context"
  5. "fmt"
  6. "net/http"
  7. "os"
  8. "os/signal"
  9. "share/internal/funcaward"
  10. "syscall"
  11. "time"
  12. "share/config"
  13. "share/docs/srv/docs"
  14. "share/internal/event"
  15. "share/internal/prometheus"
  16. "share/internal/share"
  17. "share/internal/utils"
  18. "share/pkg/db"
  19. "share/pkg/log"
  20. "git.jiaxianghudong.com/yunfan/yunfan"
  21. "github.com/pkg/errors"
  22. )
  23. var (
  24. Version = "0.0.1"
  25. BuildTime string
  26. )
  27. // @title 家乡互动 Share API
  28. // @version 0.1
  29. // @description 家乡互动分享服务
  30. // @BasePath /share/v2
  31. // @host localhost:9091
  32. func main() {
  33. log.Infow("", "Version", Version, "BuildTime", BuildTime)
  34. // 初始化Mysql
  35. cfgMysql := config.GetMysql()
  36. if err := db.Init(cfgMysql.Addr,
  37. cfgMysql.UserName,
  38. cfgMysql.Password,
  39. db.DB(cfgMysql.Db...),
  40. db.MaxIdle(cfgMysql.MaxIdle),
  41. db.MaxCons(cfgMysql.MaxOpen),
  42. db.ParseTime()); err != nil {
  43. log.Error(errors.WithMessage(err, "init mysql failed"))
  44. return
  45. }
  46. // 服务退出前,释放数据库资源
  47. defer db.Close()
  48. event.WatchEvent()
  49. // 道具服务连接
  50. share.ConnPropSrv()
  51. // 初始化分享埋点配置
  52. funcaward.InitAwards()
  53. httpPort := config.HTTPPort()
  54. mode := config.RunMode()
  55. if mode == "debug" {
  56. docs.SwaggerInfo.Host = fmt.Sprintf("%s:%d", utils.GetInternalIP(), httpPort)
  57. //docs.SwaggerInfo.Host = fmt.Sprintf("%s:%d", "192.168.14.117", httpPort)
  58. docs.SwaggerInfo.Version = Version
  59. }
  60. prometheus.Init("yunfan", config.GetName(), mode, utils.GetInternalIP())
  61. // 有设置RPC端口,则运行RPC服务
  62. if config.GetRPCPort() != 0 {
  63. go func() {
  64. if err := share.RunRPC(); err != nil && err != yunfan.ErrShutdown {
  65. log.Error(errors.WithMessage(err, "server run rpc failed"))
  66. os.Exit(1)
  67. return
  68. }
  69. }()
  70. }
  71. // 有设置HTTP端口, 则运行HTTP服务
  72. if httpPort != 0 {
  73. // 启动服务监听
  74. go func(port int, mode string) {
  75. if err := share.RunHttp(port, mode); err != nil && err != http.ErrServerClosed {
  76. log.Error(errors.WithMessage(err, "server run http failed"))
  77. os.Exit(1)
  78. return
  79. }
  80. }(httpPort, mode)
  81. }
  82. log.Infof("server[%s] serving on port:%d", mode, httpPort)
  83. waitStop()
  84. }
  85. // waitStop 等待服务停止
  86. func waitStop() {
  87. // 捕捉退出信号
  88. sig := make(chan os.Signal, 1)
  89. signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP)
  90. s := <-sig
  91. log.Infof("receive signal:%d , server stopping ...", s)
  92. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  93. defer cancel()
  94. if err := share.Stop(ctx); err != nil {
  95. log.Error(errors.Wrap(err, "server stop failed"))
  96. return
  97. }
  98. log.Info("server exited")
  99. _ = log.Sync()
  100. }