component.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package redis
  2. import (
  3. "context"
  4. "reflect"
  5. cfacade "github.com/cherry-game/cherry/facade"
  6. clog "github.com/cherry-game/cherry/logger"
  7. cprofile "github.com/cherry-game/cherry/profile"
  8. "github.com/go-redis/redis/v8"
  9. )
  10. type (
  11. Component struct {
  12. cfacade.Component
  13. clientList []IClient
  14. }
  15. )
  16. func New() *Component {
  17. return &Component{
  18. clientList: allList(),
  19. }
  20. }
  21. func NewClients(clientList ...IClient) *Component {
  22. return &Component{
  23. clientList: clientList,
  24. }
  25. }
  26. func (*Component) Name() string {
  27. return "redis_component"
  28. }
  29. func (p *Component) Init() {
  30. if len(p.clientList) < 1 {
  31. clog.Fatalf("[nodeID = %s] redis client list is empty.", p.App().NodeID())
  32. return
  33. }
  34. rdbIDList := p.App().Settings().Get("redis_id_list")
  35. if rdbIDList.LastError() != nil || rdbIDList.Size() < 1 {
  36. clog.Fatalf("[nodeID = %s] `redis_id_list` property not exists.", p.App().NodeID())
  37. return
  38. }
  39. // 从profile-xx.json 获取所有redis节点配置信息
  40. redisConfigList := cprofile.GetConfig("redis")
  41. if redisConfigList.LastError() != nil {
  42. clog.Fatal("`redis` property not exists.")
  43. return
  44. }
  45. // redis客户端实例 key:configID, value:*redis.Client
  46. clientMap := map[string]*client{}
  47. // 根据当前节点redis的配置构造 *redis.Client
  48. for _, configID := range rdbIDList.Keys() {
  49. if _, found := clientMap[configID]; found {
  50. continue
  51. }
  52. redisID := rdbIDList.Get(configID).ToString()
  53. if len(redisID) < 1 {
  54. clog.Fatalf("RedisID not found. [configID = %s]", configID)
  55. return
  56. }
  57. redisConfig := GetConfigWithRedisID(redisConfigList, redisID)
  58. if redisConfig == nil {
  59. clog.Fatalf("Redis config not found. [configID = %s, redisID = %s]", configID, redisID)
  60. return
  61. }
  62. // add
  63. clientMap[configID] = p.newClient(redisConfig)
  64. clog.Infof("New redis *client [configID = %s, redisID = %s]", configID, redisID)
  65. }
  66. // 根据自定义redis实例注入*client
  67. for _, instance := range p.clientList {
  68. client, found := clientMap[instance.ConfigID()]
  69. if !found {
  70. clog.Fatalf("Redis config not found. [configID = %s]", instance.ConfigID())
  71. return
  72. }
  73. instance.load(client)
  74. clog.Infof("Load [type = %v, configID = %s, redisID = %s]",
  75. reflect.TypeOf(instance).String(),
  76. instance.ConfigID(),
  77. instance.RedisID(),
  78. )
  79. }
  80. }
  81. func (*Component) OnStop() {
  82. }
  83. func (p *Component) OnAfterInit() {
  84. }
  85. func GetConfigWithRedisID(allList cfacade.ProfileJSON, redisID string) cfacade.ProfileJSON {
  86. for i := 0; i < allList.Size(); i++ {
  87. item := allList.GetConfig(i)
  88. if item.Get("redis_id").ToString() == redisID {
  89. return item
  90. }
  91. }
  92. return nil
  93. }
  94. func NewClientOption(item cfacade.ProfileJSON) (string, *redis.Options) {
  95. redisID := item.GetString("redis_id")
  96. address := item.GetString("address")
  97. password := item.GetString("password")
  98. db := item.GetInt("db")
  99. poolSize := item.GetInt("pool_size", 32)
  100. options := &redis.Options{
  101. Addr: address,
  102. Password: password,
  103. DB: db,
  104. PoolSize: poolSize,
  105. OnConnect: func(ctx context.Context, cn *redis.Conn) error {
  106. clog.Infof("[redisID = %s] connected! [address = %s]", redisID, address)
  107. return nil
  108. },
  109. }
  110. return redisID, options
  111. }
  112. func (p *Component) newClient(item cfacade.ProfileJSON) *client {
  113. redisID, options := NewClientOption(item)
  114. return newClient(redisID, options)
  115. }