init_service.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package utils
  2. import (
  3. "context"
  4. "fmt"
  5. "go-policy-service/config"
  6. "log"
  7. "os"
  8. "time"
  9. "github.com/go-redis/redis/v8"
  10. "go.mongodb.org/mongo-driver/mongo"
  11. "go.mongodb.org/mongo-driver/mongo/options"
  12. "gorm.io/driver/mysql"
  13. "gorm.io/gorm"
  14. )
  15. var Db *gorm.DB
  16. var Rdb *redis.Client
  17. var Mongo *mongo.Client
  18. func InitDB(cfg *config.Config) error {
  19. dsn := getDSN(cfg)
  20. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  21. if err != nil {
  22. return err
  23. }
  24. sqlDB, _ := db.DB()
  25. sqlDB.SetMaxIdleConns(cfg.DBMaxIdle)
  26. sqlDB.SetMaxOpenConns(cfg.DBMaxOpen)
  27. sqlDB.SetConnMaxLifetime(time.Duration(cfg.DBMaxLifetime) * time.Minute)
  28. Db = db
  29. return nil
  30. }
  31. func getDSN(cfg *config.Config) string {
  32. return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4",
  33. cfg.DBUser,
  34. cfg.DBPassword,
  35. cfg.DBHost,
  36. cfg.DBPort,
  37. cfg.DBName)
  38. }
  39. // 初始化 Redis
  40. func InitRedis(cfg *config.Config) error {
  41. Rdb = redis.NewClient(&redis.Options{
  42. Addr: fmt.Sprintf("%s:%d", cfg.RedisHost, cfg.RedisPort),
  43. Password: cfg.RedisPassword,
  44. DB: cfg.RedisDB,
  45. DialTimeout: 5 * time.Second,
  46. })
  47. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  48. defer cancel()
  49. if _, err := Rdb.Ping(ctx).Result(); err != nil {
  50. return fmt.Errorf("redis connection failed: %w", err)
  51. }
  52. return nil
  53. }
  54. func InitMongoDB(cfg *config.Config) {
  55. // 从环境变量中获取 MongoDB 连接信息
  56. dsn := os.Getenv("MONGO_DSN")
  57. host := os.Getenv("MONGO_HOST")
  58. port := os.Getenv("MONGO_PORT")
  59. // 如果存在 MONGO_DSN 环境变量,则使用它来建立连接
  60. var client *mongo.Client
  61. var err error
  62. if dsn != "" {
  63. client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI(dsn))
  64. } else {
  65. // 否则,使用 host 和 port 构建连接 URI
  66. uri := fmt.Sprintf("mongodb://%s:%s", host, port)
  67. client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
  68. }
  69. if err != nil {
  70. log.Fatal(err)
  71. }
  72. // 检查连接
  73. err = client.Ping(context.TODO(), nil)
  74. if err != nil {
  75. log.Fatal(err)
  76. }
  77. Mongo = client
  78. fmt.Println("Connected to MongoDB!")
  79. }
  80. func CloseResources() {
  81. if Db != nil {
  82. sqlDB, err := Db.DB()
  83. if err != nil {
  84. Logger.Error("Failed to get SQL DB: ", err)
  85. return
  86. }
  87. if err := sqlDB.Close(); err != nil {
  88. Logger.Error("Failed to close MySQL connection: ", err)
  89. }
  90. }
  91. if Rdb != nil {
  92. if err := Rdb.Close(); err != nil {
  93. Logger.Error("Failed to close Redis connection: ", err)
  94. }
  95. }
  96. if Mongo != nil {
  97. if err := Mongo.Disconnect(context.TODO()); err != nil {
  98. Logger.Error("Failed to close MongoDB connection: ", err)
  99. }
  100. }
  101. }