cmd.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package boot
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "time"
  9. "github.com/gin-gonic/gin"
  10. "github.com/gomodule/redigo/redis"
  11. "github.com/spf13/viper"
  12. "go.uber.org/zap"
  13. "passport/app/router"
  14. "passport/client/mysql"
  15. "passport/client/sredis"
  16. "passport/logger"
  17. )
  18. const (
  19. // gracefulTimeout controls how long we wait before forcefully terminating
  20. gracefulTimeout = 3 * time.Second
  21. )
  22. func Run() int {
  23. var err error
  24. StoreInit()
  25. err = InitModel()
  26. if err != nil {
  27. panic(err)
  28. }
  29. go StartHttpServer()
  30. return handleSignals()
  31. }
  32. //初始化相关必要持久化服务
  33. func StoreInit() {
  34. //连接mysql
  35. var err error
  36. // 连接数据库
  37. _, err = mysql.Dial("mysql", viper.GetString("mysql.address"))
  38. if err != nil {
  39. panic(err)
  40. }
  41. //初始化redis
  42. sredis.MasterPool = &redis.Pool{ //实例化一个连接池
  43. MaxIdle: 16, //最初的连接数量
  44. // MaxActive:1000000, //最大连接数量
  45. MaxActive: 0, //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配
  46. IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
  47. Dial: func() (redis.Conn, error) { //要连接的redis数据库
  48. conn, err := redis.Dial("tcp", viper.GetString("redis.master.address"))
  49. if err != nil {
  50. return nil, err
  51. }
  52. if viper.GetString("redis.master.password") != "" {
  53. _, err = conn.Do("AUTH", viper.GetString("redis.master.password"))
  54. if err != nil {
  55. return nil, err
  56. }
  57. }
  58. return conn, err
  59. },
  60. }
  61. sredis.SalvePool = &redis.Pool{ //实例化一个连接池
  62. MaxIdle: 16, //最初的连接数量
  63. // MaxActive:1000000, //最大连接数量
  64. MaxActive: 0, //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配
  65. IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
  66. Dial: func() (redis.Conn, error) { //要连接的redis数据库
  67. conn, err := redis.Dial("tcp", viper.GetString("redis.slave.address"))
  68. if err != nil {
  69. return nil, err
  70. }
  71. if viper.GetString("redis.slave.password") != "" {
  72. _, err = conn.Do("AUTH", viper.GetString("redis.slave.password"))
  73. if err != nil {
  74. return nil, err
  75. }
  76. }
  77. return conn, err
  78. },
  79. }
  80. }
  81. //启动服务
  82. func StartHttpServer() {
  83. //
  84. r := gin.Default()
  85. router.StepRouters(r)
  86. addr := fmt.Sprintf("%s:%d", viper.GetString("server.host"), viper.GetInt("server.port"))
  87. logger.Info(fmt.Sprintf("Http Server has been started. http://%s", addr))
  88. logger.Fatal("start http server", zap.Error(http.ListenAndServe(addr, r)))
  89. }
  90. func handleSignals() int {
  91. signalCh := make(chan os.Signal, 4)
  92. signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
  93. WAIT:
  94. // Wait for a signal
  95. var sig os.Signal
  96. select {
  97. case s := <-signalCh:
  98. sig = s
  99. }
  100. //log.Info(fmt.Sprintf("Caught signal: %v", sig))
  101. // Check if this is a SIGHUP
  102. if sig == syscall.SIGHUP {
  103. //重新加载配置
  104. goto WAIT
  105. }
  106. // Check if we should do a graceful leave
  107. graceful := false
  108. if sig == syscall.SIGTERM || sig == os.Interrupt {
  109. graceful = true
  110. }
  111. // Fail fast if not doing a graceful leave
  112. if !graceful {
  113. return 1
  114. }
  115. // Attempt a graceful leave
  116. gracefulCh := make(chan struct{})
  117. //log.Info("Gracefully shutting down...")
  118. go func() {
  119. //if err := c.Sys.Leave(); err != nil {
  120. // log.Error(fmt.Sprintf("Error: %s", err))
  121. // return
  122. //}
  123. close(gracefulCh)
  124. }()
  125. // Wait for leave or another signal
  126. select {
  127. case <-signalCh:
  128. return 1
  129. case <-time.After(gracefulTimeout):
  130. return 1
  131. case <-gracefulCh:
  132. return 0
  133. }
  134. }