package main import ( "context" "net/http" "os" "os/signal" "syscall" "time" //"mtp2_if/algorithm" "mtp2_if/account" "mtp2_if/busdriver" "mtp2_if/config" "mtp2_if/db" "mtp2_if/goods" "mtp2_if/logger" "mtp2_if/protocol" "mtp2_if/rediscli" "mtp2_if/token" "github.com/DeanThompson/ginpprof" "github.com/gin-gonic/gin" _ "github.com/mattn/go-oci8" ) func main() { // 测试 //algorithm.Test(10) // 初始化配置 err := config.SerCfg.Init("config/config.xml") if err != nil { println("read config file failed:", err) return } // 测试rabbitMQ busdriver.TestBus() // 初始化日志组件 err = logger.Init(config.SerCfg.GetLogSetting()) if err != nil { println("init logger failed:", err) return } // 初始化数据库引擎 err = db.InitDbEngine() if err != nil { logger.GetLogger().Errorf("init db engine failed:", err.Error()) return } defer db.Close() // 初始化Redis客户端 err = rediscli.InitRedisCli() if err != nil { logger.GetLogger().Errorf("init redis client failed:", err.Error()) return } defer rediscli.CloseReidsClient() // protobuf测试 protocol.TestProto() // 初始化token校验 token.Init() if config.SerCfg.GetDebugMode() { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) } r := gin.New() // 设置日志中间件 r.Use(ginLoggerMiddleware()) // 设置奔溃中间件 r.Use(ginRecoveryMiddleware()) // 路由分组 gr := r.Group("/goods") gropt := gr.Group("/goodsopt") { gropt.POST("/QueryGoods", goods.QueryGoods) gropt.POST("/GetGoods", goods.GetGoods) gropt.POST("/GetAllGoods", goods.GetAllGoods) } ar := r.Group("/account") aropt := ar.Group("/accountopt") { aropt.POST("/GetAccount", account.GetAccount) aropt.POST("/GetReckonAccount", account.GetReckonAccount) } bus := r.Group("/bus") busopt := bus.Group("/busopt") { busopt.POST("/SubTopic", busdriver.SubTopic) busopt.POST("/MsgPublish", busdriver.MsgPublish) } timeout := 15 * time.Second // doubg模式启用pprof if config.SerCfg.GetDebugMode() { dm := r.Group("/debug/pprof") ginpprof.WrapGroup(dm) timeout = 60 * time.Second } // 声明web服务 webser := &http.Server{ Handler: r, Addr: config.SerCfg.GetWebListenAddr(), WriteTimeout: timeout, ReadTimeout: timeout, } cxt, cancel := context.WithCancel(context.Background()) defer cancel() // 启动服务 c := make(chan struct{}, 1) go func() { defer close(c) if err := webser.ListenAndServe(); err != nil { logger.GetLogger().Errorf("Start service failed[%s].", err.Error()) c <- struct{}{} } }() // 信号控制 s := make(chan os.Signal, 1) signal.Notify(s, syscall.SIGINT, syscall.SIGTERM) select { case <-s: logger.GetLogger().Debug("Shutdown service...") timeCxt, tCancel := context.WithTimeout(cxt, 5*time.Second) defer tCancel() if err = webser.Shutdown(timeCxt); err != nil { logger.GetLogger().Errorf("Shutdown service failed: %s", err.Error()) } case <-c: } signal.Stop(s) defer close(s) logger.GetLogger().Debug("Service stopped") //listenaddr := config.SerCfg.GetWebListenAddr() //r.Run(listenaddr) } func ginLoggerMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() end := time.Now() latency := end.Sub(start) path := c.Request.URL.RequestURI() clientip := c.ClientIP() method := c.Request.Method statuscode := c.Writer.Status() logger.GetLogger().Infof("|%3d|%13v|%15s|%s %s", statuscode, latency, clientip, method, path) } } func ginRecoveryMiddleware() gin.HandlerFunc { return gin.RecoveryWithWriter(logger.GetLogWriter()) }