boot.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package boot
  2. import (
  3. "context"
  4. "fmt"
  5. redisLib "github.com/go-redis/redis/v8"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/net/ghttp"
  8. "github.com/gogf/gf/os/gcron"
  9. "go.uber.org/dig"
  10. "gorm.io/gorm"
  11. agent2 "gxt-file-server/app/agent"
  12. "gxt-file-server/app/bll"
  13. "gxt-file-server/app/bll/impl"
  14. "gxt-file-server/app/model"
  15. "gxt-file-server/pkg/gplus"
  16. "gxt-file-server/pkg/logger"
  17. "gxt-file-server/pkg/middleware"
  18. "gxt-file-server/pkg/redis"
  19. "gxt-file-server/pkg/store"
  20. "gxt-file-server/pkg/utils"
  21. "gxt-file-server/router"
  22. "log"
  23. "os"
  24. )
  25. // VERSION 定义应用版本号
  26. const VERSION = "1.0.0"
  27. func init() {
  28. // 初始化logger
  29. logger.Init(g.Cfg().GetString("common.run_mode"))
  30. logger.SetVersion(VERSION)
  31. logger.SetTraceIdFunc(utils.NewTraceID)
  32. ctx := logger.NewTraceIDContext(context.Background(), utils.NewTraceID())
  33. Init(ctx)
  34. }
  35. // Init 初始化App,
  36. func Init(ctx context.Context) func() {
  37. logger.Printf(ctx, "服务启动,运行模式:%s,版本号:%s,进程号:%d", g.Cfg().Get("common.run_mode"), VERSION, os.Getpid())
  38. // 初始化依赖注入容器
  39. container, call := buildContainer(ctx)
  40. // 初始化路由注册
  41. s := g.Server()
  42. // 每个请求生成新的追踪Id,如果上下文件中没有trace-id
  43. s.Use(middleware.TraceIdMiddleware())
  44. // file middleware
  45. filePrefix := fmt.Sprintf("/%s/", g.Cfg().GetString("agent.DefaultFilePathPrefix"))
  46. s.Use(middleware.FileMiddleWare(middleware.AllowPathPrefixNoSkipper(filePrefix)))
  47. // 统一处理内部错误
  48. s.Use(func(r *ghttp.Request) {
  49. r.Middleware.Next()
  50. if err := r.GetError(); err != nil {
  51. gplus.ResError(r, err)
  52. }
  53. })
  54. initCron(ctx, container)
  55. router.InitRouters(s, container)
  56. return func() {
  57. if call != nil {
  58. call()
  59. }
  60. }
  61. }
  62. // 初始化redis
  63. func initRedis(ctx context.Context, container *dig.Container) func() {
  64. addr := g.Cfg().GetString("redis.addr")
  65. password := g.Cfg().GetString("redis.password")
  66. db := g.Cfg().GetInt("redis.db")
  67. redisCli := redis.Init(ctx, addr, password, db)
  68. redisCli.ConfigSet(ctx, "set notify-keyspace-events", "Ex")
  69. logger.Printf(ctx, "REDIS初始化成功,当前服务器[%s, %d]", addr, db)
  70. // 注入redis client
  71. _ = container.Provide(func() *redisLib.Client {
  72. return redisCli
  73. })
  74. return func() {
  75. _ = redisCli.Close()
  76. }
  77. }
  78. func initAgent(ctx context.Context, container *dig.Container) func() {
  79. _ = container.Invoke(func(rCli *redisLib.Client, fhm model.IFileHistory) {
  80. addr := g.Cfg().GetString("minio.addr")
  81. aKey := g.Cfg().GetString("minio.assess_key")
  82. sKey := g.Cfg().GetString("minio.secret_key")
  83. m := store.MiniStoreInit(addr, aKey, sKey)
  84. agent2.DefaultAgent().SetBackend(m)
  85. agent2.DefaultAgent().SetConfig(&agent2.Config{
  86. DefaultExpireTime: g.Cfg().GetInt("agent.DefaultExpireTime"),
  87. })
  88. agent2.DefaultAgent().SetRedisClient(rCli)
  89. agent2.DefaultAgent().SetFileHistoryModel(fhm)
  90. _ = agent2.DefaultAgent().Start(ctx)
  91. })
  92. return func() {
  93. }
  94. }
  95. // 初始化存储,目前只初始化gorm
  96. func initStore(ctx context.Context, container *dig.Container) (func(), error) {
  97. var storeCall func()
  98. db, err := initGorm()
  99. if err != nil {
  100. return storeCall, err
  101. }
  102. // 如果自动映射数据表
  103. if g.Cfg().GetBool("gorm.enable_auto_migrate") {
  104. err = autoMigrate(db)
  105. if err != nil {
  106. return storeCall, err
  107. }
  108. }
  109. // 注入DB
  110. _ = container.Provide(func() *gorm.DB { return db })
  111. // 注入model接口
  112. _ = InjectModel(container)
  113. storeCall = func() {
  114. sqlDb, _ := db.DB()
  115. _ = sqlDb.Close()
  116. }
  117. logger.Printf(ctx, "MYSQL初始化成功, 服务器[%s], 数据库[%s]",
  118. g.Cfg().GetString("mysql.host"),
  119. g.Cfg().GetString("mysql.db_name"))
  120. return storeCall, nil
  121. }
  122. // 构建依赖注入容器
  123. func buildContainer(ctx context.Context) (*dig.Container, func()) {
  124. container := dig.New()
  125. // 初始化存储模块
  126. storeCall, err := initStore(ctx, container)
  127. if err != nil {
  128. panic(err)
  129. }
  130. // 初始化redis模块
  131. var redisCall func()
  132. if g.Cfg().GetBool("redis.enable") {
  133. redisCall = initRedis(ctx, container)
  134. }
  135. agentCall := initAgent(ctx, container)
  136. // 注入bll
  137. impl.Inject(container)
  138. return container, func() {
  139. if storeCall != nil {
  140. storeCall()
  141. }
  142. if redisCall != nil {
  143. redisCall()
  144. }
  145. if agentCall != nil {
  146. agentCall()
  147. }
  148. }
  149. }
  150. func initCron(ctx context.Context, container *dig.Container) {
  151. //秒 分 时 日 月 周
  152. runMode := g.Cfg().GetString("common.run_mode")
  153. _ = container.Invoke(func(
  154. chunk bll.IFileChunk,
  155. ) {
  156. switch runMode {
  157. case "debug", "test":
  158. initCronDebug(ctx, chunk) //定时清理过期文件块
  159. case "release":
  160. initCronRelease(ctx, chunk) //定时清理过期文件块
  161. }
  162. logger.Printf(ctx, "gCorn初始化成功\n")
  163. })
  164. }
  165. func initCronDebug(ctx context.Context, chunk bll.IFileChunk) {
  166. _, err := gcron.Add("0 5 * * * *", func() {
  167. err := chunk.ClearChunks(ctx)
  168. if err != nil {
  169. log.Fatalln(err)
  170. return
  171. }
  172. })
  173. if err != nil {
  174. logger.Errorf(ctx, err.Error())
  175. }
  176. }
  177. func initCronRelease(ctx context.Context, chunk bll.IFileChunk) {
  178. clearChunk := g.Cfg().GetString("corn.clear_chunk")
  179. _, err := gcron.Add(clearChunk, func() {
  180. err := chunk.ClearChunks(ctx)
  181. if err != nil {
  182. log.Fatalln(err)
  183. return
  184. }
  185. })
  186. if err != nil {
  187. logger.Errorf(ctx, err.Error())
  188. }
  189. }