api.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //go:build !migrate && !createApp && !project
  2. package server
  3. import (
  4. "IotAdmin/app/router"
  5. "IotAdmin/app/schedule/jobs"
  6. "IotAdmin/app/system/models"
  7. "IotAdmin/common/database"
  8. "IotAdmin/common/global"
  9. "IotAdmin/common/middleware"
  10. "IotAdmin/common/storage"
  11. ext "IotAdmin/config"
  12. "IotAdmin/core/config/source/file"
  13. "IotAdmin/core/sdk"
  14. "IotAdmin/core/sdk/config"
  15. "IotAdmin/core/sdk/pkg"
  16. "IotAdmin/iot"
  17. iotDb "IotAdmin/iot/db"
  18. "context"
  19. "errors"
  20. "fmt"
  21. "log"
  22. "net/http"
  23. "os"
  24. "os/signal"
  25. "time"
  26. "github.com/gin-gonic/gin"
  27. "github.com/spf13/pflag"
  28. )
  29. var (
  30. apiCheck = pflag.BoolP("api", "a", false, "启动服务器检查 API 数据")
  31. )
  32. // 初始化
  33. func init() {
  34. // 注入配置扩展项
  35. config.ExtendConfig = &ext.ExtConfig
  36. //1. 读取配置
  37. config.Setup(
  38. file.NewSource(file.WithPath(*configYml)),
  39. database.Setup,
  40. storage.Setup,
  41. )
  42. //2. 注册监听函数
  43. queue := sdk.Runtime.GetMemoryQueue("")
  44. queue.Register(global.LoginLog, models.SaveLoginLog)
  45. queue.Register(global.OperateLog, models.SaveOperaLog)
  46. queue.Register(global.ApiCheck, models.SaveSysApi)
  47. queue.Register(global.DtuChangeStatus, iotDb.DtuChangeStatus)
  48. queue.Register(global.DtuDeviceChange, iotDb.DtuDeviceChange)
  49. queue.Register(global.UpdateMeterCalc, iotDb.UpdateMeterCalc)
  50. go queue.Run()
  51. //3. 注册路由
  52. // 在app/router目录下新建文件 放在init方法 参考system
  53. usageStr := `正在启动API服务...`
  54. log.Println(usageStr)
  55. }
  56. func Init() {
  57. if config.ApplicationConfig.Mode == pkg.ModeProd.String() {
  58. gin.SetMode(gin.ReleaseMode)
  59. }
  60. initWebServer()
  61. srv := &http.Server{
  62. Addr: fmt.Sprintf("%s:%d", config.ApplicationConfig.Host, config.ApplicationConfig.Port),
  63. Handler: sdk.Runtime.GetEngine(),
  64. }
  65. // 数据采集服务
  66. go iot.InitIotService()
  67. // 定时任务
  68. go jobs.Start()
  69. if *apiCheck {
  70. var routers = sdk.Runtime.GetRouter()
  71. q := sdk.Runtime.GetMemoryQueue("")
  72. mp := make(map[string]interface{})
  73. mp["List"] = routers
  74. message, err := sdk.Runtime.GetStreamMessage("", global.ApiCheck, mp)
  75. if err != nil {
  76. log.Printf("GetStreamMessage 错误, %s \n", err.Error())
  77. //日志报错错误,不中断请求
  78. } else {
  79. err = q.Append(message)
  80. if err != nil {
  81. log.Printf("Append Message 错误, %s \n", err.Error())
  82. }
  83. }
  84. }
  85. go func() {
  86. // 服务连接
  87. if config.SslConfig.Enable {
  88. if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && !errors.Is(err, http.ErrServerClosed) {
  89. log.Fatal("监听TLS错误: ", err)
  90. }
  91. } else {
  92. if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
  93. log.Fatal("监听错误: ", err)
  94. }
  95. }
  96. }()
  97. fmt.Println(pkg.Green("Server Run At:"))
  98. fmt.Printf("- Local: %s://localhost:%d/ \r\n", "http", config.ApplicationConfig.Port)
  99. fmt.Printf("- Network: %s://%s:%d/ \r\n", "http", pkg.GetLocalHost(), config.ApplicationConfig.Port)
  100. fmt.Println(pkg.Green("Swagger Run At:"))
  101. fmt.Printf("- Local: http://localhost:%d/swagger/admin/index.html \r\n", config.ApplicationConfig.Port)
  102. fmt.Printf("- Network: %s://%s:%d/swagger/system/index.html \r\n", "http", pkg.GetLocalHost(), config.ApplicationConfig.Port)
  103. fmt.Printf("%s 输入 Control + C 关闭服务 \r\n", pkg.GetCurrentTimeStr())
  104. // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
  105. quit := make(chan os.Signal, 1)
  106. signal.Notify(quit, os.Interrupt)
  107. <-quit
  108. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  109. defer cancel()
  110. fmt.Printf("%s 关闭服务... \r\n", pkg.GetCurrentTimeStr())
  111. if err := srv.Shutdown(ctx); err != nil {
  112. log.Fatal("服务关闭:", err)
  113. }
  114. log.Println("服务退出")
  115. }
  116. func initWebServer() {
  117. var r *gin.Engine
  118. h := sdk.Runtime.GetEngine()
  119. if h == nil {
  120. h = gin.New()
  121. sdk.Runtime.SetEngine(h)
  122. }
  123. switch h.(type) {
  124. case *gin.Engine:
  125. r = h.(*gin.Engine)
  126. // 注册中间件
  127. middleware.UseGinMiddleware(r)
  128. // 注册路由
  129. router.RegisterRouter()
  130. default:
  131. log.Fatal("不支持其他 Engine")
  132. //os.Exit(-1)
  133. }
  134. }