server.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package api
  2. import (
  3. "context"
  4. "device-manage/app/admin/models/busmodels"
  5. "device-manage/app/admin/router"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "os/signal"
  11. "time"
  12. "github.com/gin-gonic/gin"
  13. "github.com/spf13/cobra"
  14. "github.com/spf13/viper"
  15. "device-manage/app/jobs"
  16. "device-manage/common/database"
  17. "device-manage/common/global"
  18. "device-manage/common/mqttcli"
  19. mycasbin "device-manage/pkg/casbin"
  20. "device-manage/pkg/logger"
  21. "device-manage/tools"
  22. "device-manage/tools/config"
  23. )
  24. var (
  25. configYml string
  26. port string
  27. mode string
  28. StartCmd = &cobra.Command{
  29. Use: "server",
  30. Short: "Start API server",
  31. Example: "device-manage server -c config/settings.yml",
  32. SilenceUsage: true,
  33. PreRun: func(cmd *cobra.Command, args []string) {
  34. setup()
  35. },
  36. RunE: func(cmd *cobra.Command, args []string) error {
  37. return run()
  38. },
  39. }
  40. )
  41. var AppRouters = make([]func(), 0)
  42. func init() {
  43. StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
  44. StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8000", "Tcp port server listening on")
  45. StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
  46. //注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法
  47. AppRouters = append(AppRouters, router.InitRouter)
  48. }
  49. func setup() {
  50. //1. 读取配置
  51. config.Setup(configYml)
  52. //2. 设置日志
  53. logger.Setup()
  54. //3. 初始化数据库链接
  55. database.Setup(config.DatabaseConfig.Driver)
  56. //4. 接口访问控制加载
  57. mycasbin.Setup()
  58. //5. 使用cache 缓存
  59. busmodels.MediaCacheSetup()
  60. busmodels.DeviceTimerSetup()
  61. //6. mqtt server
  62. mqttcli.MqttSetup()
  63. usageStr := `starting api server`
  64. global.Logger.Info(usageStr)
  65. }
  66. func run() error {
  67. if viper.GetString("settings.application.mode") == string(tools.ModeProd) {
  68. gin.SetMode(gin.ReleaseMode)
  69. }
  70. engine := global.Cfg.GetEngine()
  71. if engine == nil {
  72. engine = gin.New()
  73. }
  74. for _, f := range AppRouters {
  75. f()
  76. }
  77. srv := &http.Server{
  78. Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
  79. Handler: global.Cfg.GetEngine(),
  80. }
  81. go func() {
  82. jobs.InitJob()
  83. jobs.Setup()
  84. }()
  85. go func() {
  86. // 服务连接
  87. if config.SslConfig.Enable {
  88. if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
  89. global.Logger.Fatal("listen: ", err)
  90. }
  91. } else {
  92. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  93. global.Logger.Fatal("listen: ", err)
  94. }
  95. }
  96. }()
  97. content, _ := ioutil.ReadFile("./static/device-manage.txt")
  98. fmt.Println(tools.Red(string(content)))
  99. tip()
  100. fmt.Println(tools.Green("Server run at:"))
  101. fmt.Printf("- Local: http://localhost:%s/ \r\n", config.ApplicationConfig.Port)
  102. fmt.Printf("- Network: http://%s:%s/ \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
  103. fmt.Println(tools.Green("Swagger run at:"))
  104. fmt.Printf("- Local: http://localhost:%s/swagger/index.html \r\n", config.ApplicationConfig.Port)
  105. fmt.Printf("- Network: http://%s:%s/swagger/index.html \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
  106. fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrentTimeStr())
  107. // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
  108. quit := make(chan os.Signal)
  109. signal.Notify(quit, os.Interrupt)
  110. <-quit
  111. fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr())
  112. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  113. defer cancel()
  114. if err := srv.Shutdown(ctx); err != nil {
  115. global.Logger.Fatal("Server Shutdown:", err)
  116. }
  117. global.Logger.Println("Server exiting")
  118. return nil
  119. }
  120. func tip() {
  121. usageStr := `欢迎使用 ` + tools.Green(`device-manage `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令`
  122. fmt.Printf("%s \n\n", usageStr)
  123. }