sdk.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package sdk
  2. import (
  3. "context"
  4. mhayaGin "github.com/mhaya/components/gin"
  5. mhayaError "github.com/mhaya/error"
  6. mhayaString "github.com/mhaya/extend/string"
  7. cfacade "github.com/mhaya/facade"
  8. "github.com/mhaya/game/game_cluster/internal/code"
  9. "github.com/mhaya/game/game_cluster/internal/constant"
  10. "github.com/mhaya/game/game_cluster/internal/data"
  11. "github.com/mhaya/game/game_cluster/internal/mdb"
  12. "github.com/mhaya/game/game_cluster/internal/token"
  13. mhayaLogger "github.com/mhaya/logger"
  14. "math/rand"
  15. )
  16. // sdk平台类型
  17. const (
  18. DevMode int = 1 // 开发模式,注册开发帐号登陆(开发时使用)
  19. QuickSDK int = 2 // quick sdk
  20. )
  21. var (
  22. invokeMaps = make(map[int]Invoke)
  23. )
  24. type (
  25. Invoke interface {
  26. SdkId() int // sdk id
  27. Reconnect(token *token.Token) (int32, *token.Token) //重连
  28. Login(config *data.SdkConfigRow, params Params, callback Callback) // Login 登录验证接口
  29. PayCallback(config *data.SdkConfigRow, c *mhayaGin.Context) // PayCallback 支付回调接口
  30. }
  31. Params map[string]string
  32. Callback func(code int32, result Params, error ...error)
  33. )
  34. func (p Params) GetInt(key string, defaultValue ...int) int {
  35. defVal := 0
  36. if len(defaultValue) > 0 {
  37. defVal = defaultValue[0]
  38. }
  39. val, found := p[key]
  40. if !found {
  41. return defVal
  42. }
  43. intVal, ok := mhayaString.ToInt(val)
  44. if ok {
  45. return intVal
  46. }
  47. return defVal
  48. }
  49. func (p Params) GetString(key string) (string, bool) {
  50. v, ok := p[key]
  51. return v, ok
  52. }
  53. func register(invoke Invoke) {
  54. invokeMaps[invoke.SdkId()] = invoke
  55. }
  56. func GetInvoke(sdkId int) (invoke Invoke, error error) {
  57. invoke, found := invokeMaps[sdkId]
  58. if found == false {
  59. return nil, mhayaError.Errorf("[sdkId = %d] not found.", sdkId)
  60. }
  61. return invoke, nil
  62. }
  63. func Init(app cfacade.IApplication) {
  64. register(quickSdk{app})
  65. }
  66. func SetNode(app cfacade.IApplication) (string, int32) {
  67. var nodeId string
  68. list := app.Discovery().ListByType("game")
  69. lNode := len(list)
  70. key := 0
  71. if lNode == 0 {
  72. return "", code.AccountBindFail
  73. } else if lNode > 1 {
  74. key = rand.Intn(lNode)
  75. }
  76. if lNode == 1 {
  77. return list[0].GetNodeId(), code.OK
  78. }
  79. nodeId = list[key].GetNodeId()
  80. if lNode > 0 {
  81. m, err := mdb.RDB.HGetAll(context.Background(), constant.ServerLoadHKey).Result()
  82. if err != nil {
  83. mhayaLogger.Warnf("[SetNode] Load too high. err=%v", err)
  84. }
  85. var maps = make(map[string]int, 10)
  86. for _, v := range list {
  87. if d, ok := m[v.GetNodeId()]; ok {
  88. p, ok := mhayaString.ToInt(d)
  89. if !ok {
  90. nodeId = list[key].GetNodeId()
  91. }
  92. maps[v.GetNodeId()] = p
  93. } else {
  94. maps[v.GetNodeId()] = 0
  95. }
  96. }
  97. wwr := NewWeightedRoundRobin(maps)
  98. info := wwr.Pick()
  99. if info == nil {
  100. mhayaLogger.Warnf("[SetNode] Load too high. data=%v", maps)
  101. return "", code.Error
  102. }
  103. nodeId = info.NodeId
  104. }
  105. return nodeId, code.OK
  106. }