You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.go 4.9 kB

2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package main
  2. // 主程序包,负责初始化配置、日志、数据库连接、分布式锁、事件执行器、扫描器服务器和定时任务。
  3. import (
  4. "fmt"
  5. "os"
  6. "sync"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/db"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/distlock"
  11. scmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/scanner"
  12. "gitlink.org.cn/cloudream/storage/scanner/internal/config"
  13. "gitlink.org.cn/cloudream/storage/scanner/internal/event"
  14. "gitlink.org.cn/cloudream/storage/scanner/internal/mq"
  15. "gitlink.org.cn/cloudream/storage/scanner/internal/tickevent"
  16. )
  17. func main() {
  18. // 初始化配置
  19. err := config.Init()
  20. if err != nil {
  21. fmt.Printf("init config failed, err: %s", err.Error())
  22. os.Exit(1)
  23. }
  24. // 初始化日志
  25. err = logger.Init(&config.Cfg().Logger)
  26. if err != nil {
  27. fmt.Printf("init logger failed, err: %s", err.Error())
  28. os.Exit(1)
  29. }
  30. // 初始化数据库连接
  31. db, err := db.NewDB(&config.Cfg().DB)
  32. if err != nil {
  33. logger.Fatalf("new db failed, err: %s", err.Error())
  34. }
  35. // 初始化消息队列连接池
  36. stgglb.InitMQPool(&config.Cfg().RabbitMQ)
  37. // 同步等待组,用于等待所有Go协程完成
  38. wg := sync.WaitGroup{}
  39. wg.Add(3)
  40. // 初始化分布式锁服务
  41. distlockSvc, err := distlock.NewService(&config.Cfg().DistLock)
  42. if err != nil {
  43. logger.Warnf("new distlock service failed, err: %s", err.Error())
  44. os.Exit(1)
  45. }
  46. go serveDistLock(distlockSvc, &wg)
  47. // 初始化事件执行器,并启动服务
  48. eventExecutor := event.NewExecutor(db, distlockSvc)
  49. go serveEventExecutor(&eventExecutor, &wg)
  50. // 初始化扫描器服务器,并启动服务
  51. agtSvr, err := scmq.NewServer(mq.NewService(&eventExecutor), &config.Cfg().RabbitMQ)
  52. if err != nil {
  53. logger.Fatalf("new agent server failed, err: %s", err.Error())
  54. }
  55. agtSvr.OnError(func(err error) {
  56. logger.Warnf("agent server err: %s", err.Error())
  57. })
  58. go serveScannerServer(agtSvr, &wg)
  59. // 初始化并启动定时任务
  60. tickExecutor := tickevent.NewExecutor(tickevent.ExecuteArgs{
  61. EventExecutor: &eventExecutor,
  62. DB: db,
  63. })
  64. startTickEvent(&tickExecutor)
  65. // 等待所有服务完成
  66. wg.Wait()
  67. }
  68. // serveEventExecutor 启动事件执行器服务
  69. // executor: 事件执行器实例
  70. // wg: 同步等待组
  71. func serveEventExecutor(executor *event.Executor, wg *sync.WaitGroup) {
  72. logger.Info("start serving event executor")
  73. err := executor.Execute()
  74. if err != nil {
  75. logger.Errorf("event executor stopped with error: %s", err.Error())
  76. }
  77. logger.Info("event executor stopped")
  78. wg.Done()
  79. }
  80. // serveScannerServer 启动扫描器服务器服务
  81. // server: 扫描器服务器实例
  82. // wg: 同步等待组
  83. func serveScannerServer(server *scmq.Server, wg *sync.WaitGroup) {
  84. logger.Info("start serving scanner server")
  85. err := server.Serve()
  86. if err != nil {
  87. logger.Errorf("scanner server stopped with error: %s", err.Error())
  88. }
  89. logger.Info("scanner server stopped")
  90. wg.Done()
  91. }
  92. // serveDistLock 启动分布式锁服务
  93. // svc: 分布式锁服务实例
  94. // wg: 同步等待组
  95. func serveDistLock(svc *distlock.Service, wg *sync.WaitGroup) {
  96. logger.Info("start serving distlock")
  97. err := svc.Serve()
  98. if err != nil {
  99. logger.Errorf("distlock stopped with error: %s", err.Error())
  100. }
  101. logger.Info("distlock stopped")
  102. wg.Done()
  103. }
  104. // startTickEvent 启动定时任务事件。
  105. // 参数 tickExecutor 为 ticket 事件执行器的指针,用于启动各种定时任务。
  106. func startTickEvent(tickExecutor *tickevent.Executor) {
  107. // 考虑增加配置文件来配置这些任务的间隔时间
  108. interval := 5 * 60 * 1000 // 定义默认的任务执行间隔时间
  109. // 启动所有 Agent 检查缓存的定时任务
  110. tickExecutor.Start(tickevent.NewBatchAllAgentCheckCache(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
  111. // 启动检查所有包的定时任务
  112. tickExecutor.Start(tickevent.NewBatchCheckAllPackage(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
  113. // 注释掉的代码块,可能是未来可能使用的任务,目前未启用
  114. // 启动检查所有存储的定时任务
  115. tickExecutor.Start(tickevent.NewBatchCheckAllStorage(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
  116. // 启动检查 Agent 状态的定时任务,此任务的执行间隔与上述任务不同
  117. tickExecutor.Start(tickevent.NewCheckAgentState(), 5*60*1000, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
  118. // 启动检查包冗余的定时任务
  119. tickExecutor.Start(tickevent.NewBatchCheckPackageRedundancy(), interval, tickevent.StartOption{RandomStartDelayMs: 20 * 60 * 1000})
  120. // 启动清理固定项目的定时任务
  121. tickExecutor.Start(tickevent.NewBatchCleanPinned(), interval, tickevent.StartOption{RandomStartDelayMs: 20 * 60 * 1000})
  122. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。