boot.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package boot
  2. import (
  3. "context"
  4. "filesdk"
  5. "github.com/dgrijalva/jwt-go"
  6. redisLib "github.com/go-redis/redis/v8"
  7. "github.com/gogf/gf/v2/frame/g"
  8. "github.com/gogf/gf/v2/net/ghttp"
  9. "go.uber.org/dig"
  10. "gorm.io/gorm"
  11. "os"
  12. "yx-dataset-server/app/bll/impl"
  13. "yx-dataset-server/app/errors"
  14. "yx-dataset-server/library/auth"
  15. "yx-dataset-server/library/gplus"
  16. "yx-dataset-server/library/logger"
  17. "yx-dataset-server/library/middleware"
  18. "yx-dataset-server/library/ragflow"
  19. "yx-dataset-server/library/redis"
  20. "yx-dataset-server/library/utils"
  21. "yx-dataset-server/router"
  22. )
  23. // VERSION 定义应用版本号
  24. const VERSION = "1.0.0"
  25. func init() {
  26. // 初始化logger
  27. logger.Init(utils.GetConfig("common.run_mode").String())
  28. logger.SetVersion(VERSION)
  29. logger.SetTraceIdFunc(utils.NewTraceID)
  30. ctx := logger.NewTraceIDContext(context.Background(), utils.NewTraceID())
  31. Init(ctx)
  32. }
  33. // 初始化App,
  34. // TODO: 返回释放回调,暂时没调用
  35. func Init(ctx context.Context) func() {
  36. logger.Printf(ctx, "服务启动,运行模式:%s,版本号:%s,进程号:%d", utils.GetConfig("common.run_mode").String(), VERSION, os.Getpid())
  37. // 初始化依赖注入容器
  38. container, call := buildContainer(ctx)
  39. // 初始化路由注册
  40. s := g.Server()
  41. // 每个请求生成新的追踪Id,如果上下文件中没有trace-id
  42. s.Use(middleware.TraceIdMiddleware())
  43. if utils.GetConfig("prometheus.enable").Bool() {
  44. p := middleware.NewPrometheus("ghttp")
  45. p.Use(s)
  46. }
  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. _ = auth.InitAuth(ctx, container)
  55. //_ = initJwtAuth(ctx, container)
  56. initFileSDK(ctx)
  57. router.InitRouters(s, container)
  58. return func() {
  59. if call != nil {
  60. call()
  61. }
  62. }
  63. }
  64. // 初始化jwt认证,可以把相关配置放到config.toml中
  65. func initJwtAuth(ctx context.Context, container *dig.Container) error {
  66. var opts []auth.Option
  67. opts = append(opts, auth.SetExpired(utils.GetConfig("jwt.expired").Int()))
  68. opts = append(opts, auth.SetSigningKey([]byte(utils.GetConfig("jwt.signing_key").String())))
  69. opts = append(opts, auth.SetKeyfunc(func(t *jwt.Token) (interface{}, error) {
  70. if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
  71. return nil, errors.ErrInvalidToken
  72. }
  73. return []byte(utils.GetConfig("jwt.signing_key").String()), nil
  74. }))
  75. switch utils.GetConfig("jwt.signing_method").String() {
  76. case "HS256":
  77. opts = append(opts, auth.SetSigningMethod(jwt.SigningMethodHS256))
  78. case "HS384":
  79. opts = append(opts, auth.SetSigningMethod(jwt.SigningMethodHS384))
  80. case "HS512":
  81. opts = append(opts, auth.SetSigningMethod(jwt.SigningMethodHS512))
  82. }
  83. var store auth.Storer
  84. switch utils.GetConfig("jwt.store").String() {
  85. case "file":
  86. case "redis":
  87. //store = redis.NewStore(&redis.Config{
  88. // Addr: rcfg.Addr,
  89. // Password: rcfg.Password,
  90. // DB: cfg.RedisDB,
  91. // KeyPrefix: cfg.RedisPrefix,
  92. //})
  93. }
  94. return container.Provide(func() auth.Auther { return auth.New(store, opts...) })
  95. }
  96. // 初始化redis
  97. func initRedis(ctx context.Context, container *dig.Container) func() {
  98. addr := utils.GetConfig("redis.addr").String()
  99. password := utils.GetConfig("redis.password").String()
  100. db := utils.GetConfig("redis.db").Int()
  101. redisCli := redis.Init(ctx, addr, password, db)
  102. logger.Printf(ctx, "REDIS初始化成功,当前服务器[%s]", addr)
  103. // 注入redis client
  104. _ = container.Provide(func() *redisLib.Client {
  105. return redisCli.GetRedisClient()
  106. })
  107. return func() {
  108. _ = redisCli.Close
  109. }
  110. }
  111. // 初始化redis
  112. func initRagHttpClient(ctx context.Context, container *dig.Container) func() {
  113. addr := utils.GetConfig("ragFlow.base_url").String()
  114. apiKey := utils.GetConfig("ragFlow.api_key").String()
  115. ragClient := ragflow.Init(ctx, addr, apiKey)
  116. logger.Printf(ctx, "REDIS初始化成功,当前服务器[%s]", addr)
  117. // 注入redis client
  118. _ = container.Provide(func() *ragflow.Client {
  119. return ragClient
  120. })
  121. return nil
  122. }
  123. // 初始化存储,目前只初始化gorm
  124. func initStore(ctx context.Context, container *dig.Container) (func(), error) {
  125. var storeCall func()
  126. db, err := initGorm()
  127. if err != nil {
  128. return storeCall, err
  129. }
  130. // 如果自动映射数据表
  131. if utils.GetConfig("gorm.enable_auto_migrate").Bool() {
  132. err = autoMigrate(db)
  133. if err != nil {
  134. return storeCall, err
  135. }
  136. }
  137. // 注入DB
  138. _ = container.Provide(func() *gorm.DB { return db })
  139. // 注入model接口
  140. _ = InjectModel(container)
  141. storeCall = func() {
  142. sqlDb, _ := db.DB()
  143. _ = sqlDb.Close()
  144. }
  145. logger.Printf(ctx, "MYSQL初始化成功, 服务器[%s], 数据库[%s]",
  146. utils.GetConfig("mysql.host"),
  147. utils.GetConfig("mysql.db_name"))
  148. return storeCall, nil
  149. }
  150. // 构建依赖注入容器
  151. func buildContainer(ctx context.Context) (*dig.Container, func()) {
  152. container := dig.New()
  153. // 初始化存储模块
  154. storeCall, err := initStore(ctx, container)
  155. if err != nil {
  156. panic(err)
  157. }
  158. // 初始化redis模块
  159. var redisCall func()
  160. if utils.GetConfig("redis.enable").Bool() {
  161. redisCall = initRedis(ctx, container)
  162. }
  163. initRagHttpClient(ctx, container)
  164. // 注入bll
  165. impl.Inject(container)
  166. return container, func() {
  167. if storeCall != nil {
  168. storeCall()
  169. }
  170. if redisCall != nil {
  171. redisCall()
  172. }
  173. }
  174. }
  175. func initFileSDK(ctx context.Context) {
  176. fileConfig := filesdk.Config{
  177. Host: utils.GetConfig("file_server.host").String(),
  178. }
  179. fileConfig.Init()
  180. }