data.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package data
  2. import (
  3. "context"
  4. "time"
  5. "github.com/go-kratos/kratos-layout/internal/conf"
  6. "github.com/go-kratos/kratos-layout/internal/data/models"
  7. "github.com/go-kratos/kratos/v2/log"
  8. "github.com/google/wire"
  9. "github.com/redis/go-redis/v9"
  10. "go.mongodb.org/mongo-driver/mongo"
  11. "go.mongodb.org/mongo-driver/mongo/options"
  12. "go.mongodb.org/mongo-driver/mongo/readconcern"
  13. "go.mongodb.org/mongo-driver/mongo/writeconcern"
  14. )
  15. // ProviderSet is data providers.
  16. var ProviderSet = wire.NewSet(NewRedis, NewData, NewMongo)
  17. // Data .
  18. type Data struct {
  19. log *log.Helper
  20. rdb *redis.Client
  21. *models.Mysql
  22. mongodb *mongo.Database
  23. }
  24. // NewData .
  25. func NewData(c *conf.Bootstrap, rdb *redis.Client, mongodb *mongo.Database, logger log.Logger, ctx context.Context) (*Data, func(), error) {
  26. cleanup := func() {
  27. }
  28. data := &Data{
  29. log: log.NewHelper(log.With(logger, "module", "data/data")),
  30. }
  31. var err error
  32. if c.Data.Database != nil {
  33. data.Mysql, err = models.NewMysql(c.Data.Database.Source, logger)
  34. if err != nil {
  35. return nil, cleanup, err
  36. }
  37. data.Mysql.XDB.SetMaxIdleConns(int(c.Data.Database.MaxIdleConns))
  38. data.Mysql.XDB.SetConnMaxIdleTime(time.Minute * 10)
  39. data.Mysql.XDB.SetMaxOpenConns(int(c.Data.Database.MaxOpenConns))
  40. }
  41. if rdb != nil {
  42. data.rdb = rdb
  43. }
  44. if mongodb != nil {
  45. data.mongodb = mongodb
  46. }
  47. cleanup = func() {
  48. if data.XDB != nil {
  49. data.XDB.Close()
  50. }
  51. if data.rdb != nil {
  52. data.rdb.Close()
  53. }
  54. if data.mongodb != nil {
  55. data.mongodb.Client().Disconnect(ctx)
  56. }
  57. }
  58. return data, cleanup, nil
  59. }
  60. func NewRedis(c *conf.Bootstrap) *redis.Client {
  61. if c.Data.Redis == nil {
  62. return nil
  63. }
  64. rdb := redis.NewClient(&redis.Options{
  65. Addr: c.Data.Redis.Addr,
  66. DB: int(c.Data.Redis.Db),
  67. DialTimeout: c.Data.Redis.DialTimeout.AsDuration(),
  68. WriteTimeout: c.Data.Redis.WriteTimeout.AsDuration(),
  69. ReadTimeout: c.Data.Redis.ReadTimeout.AsDuration(),
  70. PoolSize: int(c.Data.Redis.PoolSize),
  71. MinIdleConns: int(c.Data.Redis.MinIdleConns),
  72. })
  73. return rdb
  74. }
  75. func NewMongo(ctx context.Context, c *conf.Bootstrap) (*mongo.Database, error) {
  76. if c.Data.Mongo == nil {
  77. return nil, nil
  78. }
  79. clientOptions := options.Client().ApplyURI(c.Data.Mongo.Uri).SetSocketTimeout(time.Second * 30).
  80. SetReadConcern(readconcern.Majority()).SetWriteConcern(writeconcern.New(writeconcern.WMajority(), writeconcern.J(true)))
  81. client, err := mongo.Connect(ctx, clientOptions)
  82. if err != nil {
  83. return nil, err
  84. }
  85. database := client.Database(c.Data.Mongo.Database)
  86. return database, nil
  87. }