main.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package main
  2. import (
  3. "context"
  4. "net/http"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "time"
  9. "mtp2_if/account"
  10. "mtp2_if/config"
  11. "mtp2_if/db"
  12. "mtp2_if/goods"
  13. "mtp2_if/logger"
  14. "mtp2_if/rediscli"
  15. "mtp2_if/token"
  16. "github.com/DeanThompson/ginpprof"
  17. "github.com/gin-gonic/gin"
  18. _ "github.com/mattn/go-oci8"
  19. )
  20. func main() {
  21. // 初始化配置
  22. err := config.SerCfg.Init("config/config.xml")
  23. if err != nil {
  24. println("read config file failed:", err)
  25. return
  26. }
  27. // 初始化日志组件
  28. err = logger.Init(config.SerCfg.GetLogSetting())
  29. if err != nil {
  30. println("init logger failed:", err)
  31. return
  32. }
  33. // 初始化数据库引擎
  34. err = db.InitDbEngine()
  35. if err != nil {
  36. println("init db engine failed:", err)
  37. return
  38. }
  39. defer db.Close()
  40. // 初始化Redis客户端
  41. err = rediscli.InitRedisCli()
  42. if err != nil {
  43. println("init redis client failed:", err)
  44. return
  45. }
  46. defer rediscli.CloseReidsClient()
  47. // 初始化token校验
  48. token.Init()
  49. if config.SerCfg.GetDebugMode() {
  50. gin.SetMode(gin.DebugMode)
  51. } else {
  52. gin.SetMode(gin.ReleaseMode)
  53. }
  54. r := gin.New()
  55. // 设置日志中间件
  56. r.Use(ginLoggerMiddleware())
  57. // 设置奔溃中间件
  58. r.Use(ginRecoveryMiddleware())
  59. // 路由分组
  60. gr := r.Group("/goods")
  61. gropt := gr.Group("/goodsopt")
  62. {
  63. gropt.POST("/QueryGoods", goods.QueryGoods)
  64. gropt.POST("/GetGoods", goods.GetGoods)
  65. }
  66. ar := r.Group("/account")
  67. aropt := ar.Group("/accountopt")
  68. {
  69. aropt.POST("/GetAccount", account.GetAccount)
  70. }
  71. timeout := 15 * time.Second
  72. // doubg模式启用pprof
  73. if config.SerCfg.GetDebugMode() {
  74. dm := r.Group("/debug/pprof")
  75. ginpprof.WrapGroup(dm)
  76. timeout = 60 * time.Second
  77. }
  78. // 声明web服务
  79. webser := &http.Server{
  80. Handler: r,
  81. Addr: config.SerCfg.GetWebListenAddr(),
  82. WriteTimeout: timeout,
  83. ReadTimeout: timeout,
  84. }
  85. cxt, cancel := context.WithCancel(context.Background())
  86. defer cancel()
  87. // 启动服务
  88. c := make(chan struct{}, 1)
  89. go func() {
  90. defer close(c)
  91. if err := webser.ListenAndServe(); err != nil {
  92. logger.GetLogger().Errorf("Start service failed[%s].", err.Error())
  93. c <- struct{}{}
  94. }
  95. }()
  96. // 信号控制
  97. s := make(chan os.Signal, 1)
  98. signal.Notify(s, syscall.SIGINT, syscall.SIGTERM)
  99. select {
  100. case <-s:
  101. logger.GetLogger().Debug("Shutdown service...")
  102. timeCxt, tCancel := context.WithTimeout(cxt, 5*time.Second)
  103. defer tCancel()
  104. if err = webser.Shutdown(timeCxt); err != nil {
  105. logger.GetLogger().Errorf("Shutdown service failed: %s", err.Error())
  106. }
  107. case <-c:
  108. }
  109. signal.Stop(s)
  110. defer close(s)
  111. logger.GetLogger().Debug("Service stopped")
  112. //listenaddr := config.SerCfg.GetWebListenAddr()
  113. //r.Run(listenaddr)
  114. }
  115. func ginLoggerMiddleware() gin.HandlerFunc {
  116. return func(c *gin.Context) {
  117. start := time.Now()
  118. c.Next()
  119. end := time.Now()
  120. latency := end.Sub(start)
  121. path := c.Request.URL.RequestURI()
  122. clientip := c.ClientIP()
  123. method := c.Request.Method
  124. statuscode := c.Writer.Status()
  125. logger.GetLogger().Infof("|%3d|%13v|%15s|%s %s",
  126. statuscode,
  127. latency,
  128. clientip,
  129. method,
  130. path)
  131. }
  132. }
  133. func ginRecoveryMiddleware() gin.HandlerFunc {
  134. return gin.RecoveryWithWriter(logger.GetLogWriter())
  135. }