data.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/go-redis/redis/v8"
  9. "github.com/google/wire"
  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.SetMaxOpenConns(int(c.Data.Database.MaxOpenConns))
  39. }
  40. if rdb != nil {
  41. data.rdb = rdb
  42. }
  43. if mongodb != nil {
  44. data.mongodb = mongodb
  45. }
  46. cleanup = func() {
  47. if data.XDB != nil {
  48. data.XDB.Close()
  49. }
  50. if data.rdb != nil {
  51. data.rdb.Close()
  52. }
  53. if data.mongodb != nil {
  54. data.mongodb.Client().Disconnect(ctx)
  55. }
  56. }
  57. return data, cleanup, nil
  58. }
  59. func NewRedis(c *conf.Bootstrap) *redis.Client {
  60. if c.Data.Redis == nil {
  61. return nil
  62. }
  63. rdb := redis.NewClient(&redis.Options{
  64. Addr: c.Data.Redis.Addr,
  65. DB: int(c.Data.Redis.Db),
  66. DialTimeout: c.Data.Redis.DialTimeout.AsDuration(),
  67. WriteTimeout: c.Data.Redis.WriteTimeout.AsDuration(),
  68. ReadTimeout: c.Data.Redis.ReadTimeout.AsDuration(),
  69. PoolSize: int(c.Data.Redis.PoolSize),
  70. MinIdleConns: int(c.Data.Redis.MinIdleConns),
  71. })
  72. return rdb
  73. }
  74. func NewMongo(ctx context.Context, c *conf.Bootstrap) (*mongo.Database, error) {
  75. if c.Data.Mongo == nil {
  76. return nil, nil
  77. }
  78. clientOptions := options.Client().ApplyURI(c.Data.Mongo.Uri).SetSocketTimeout(time.Second * 30).
  79. SetReadConcern(readconcern.Majority()).SetWriteConcern(writeconcern.New(writeconcern.WMajority(), writeconcern.J(true)))
  80. client, err := mongo.Connect(ctx, clientOptions)
  81. if err != nil {
  82. return nil, err
  83. }
  84. database := client.Database(c.Data.Mongo.Database)
  85. return database, nil
  86. }