main.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. jsoniter "github.com/json-iterator/go"
  6. mhayaHttp "github.com/mhaya/extend/http"
  7. "github.com/mhaya/game/game_cluster/internal/code"
  8. "github.com/mhaya/game/game_cluster/internal/param"
  9. mhayaLogger "github.com/mhaya/logger"
  10. "math/rand"
  11. "strconv"
  12. "sync"
  13. "time"
  14. )
  15. func main() {
  16. // 定义命令行标志
  17. userOffset := flag.Int("userOffset", 500000, "用户偏移量")
  18. count := flag.Int("count", 100000, "请求总数")
  19. qps := flag.Int("qps", 500, "最大并发数")
  20. url := flag.String("url", "http://127.0.0.1:20000", "请求url")
  21. url1 := flag.String("url1", "http://127.0.0.1:20001", "请求url")
  22. url2 := flag.String("url2", "http://127.0.0.1:20002", "请求url")
  23. url3 := flag.String("url3", "http://127.0.0.1:20003", "请求url")
  24. duration := flag.Int("duration", 120, "测试持续时间")
  25. flag.Parse()
  26. startTime := time.Now()
  27. var wg sync.WaitGroup
  28. wg.Add(*count)
  29. // 创建一个 channel 来控制请求的速率
  30. reqCh := make(chan struct{}, *qps)
  31. // 控制请求速率的 goroutine
  32. go func() {
  33. ticker := time.NewTicker(time.Second / time.Duration(*qps))
  34. defer ticker.Stop()
  35. for range ticker.C {
  36. reqCh <- struct{}{}
  37. }
  38. }()
  39. // 发送请求的 goroutine
  40. go func() {
  41. for i := *userOffset; i < *count+*userOffset; i++ {
  42. <-reqCh
  43. go func() {
  44. defer wg.Done()
  45. str := strconv.Itoa(i)
  46. account := &param.LoginReq{
  47. Pid: 2,
  48. OpenID: str,
  49. Platform: "ios",
  50. Channel: "tg",
  51. }
  52. n := rand.Intn(1)
  53. switch n {
  54. case 0:
  55. RunRobot(*url, account, i)
  56. case 1:
  57. RunRobot(*url1, account, i)
  58. case 2:
  59. RunRobot(*url2, account, i)
  60. case 3:
  61. RunRobot(*url3, account, i)
  62. }
  63. }()
  64. }
  65. }()
  66. // 等待所有请求完成
  67. wg.Wait()
  68. fmt.Println("All goroutines have finished.")
  69. qpsAchieved := float64(*count) / time.Since(startTime).Seconds()
  70. fmt.Printf("Sent %d requests in %v, achieved QPS: %.2f\n", *count, duration, qpsAchieved)
  71. }
  72. func RunRobot(url string, val *param.LoginReq, num int) {
  73. fmt.Println("start goroutines i:%v", num)
  74. token := RegisterDevAccount(url, val)
  75. if token == "" {
  76. return
  77. }
  78. params := map[string]interface{}{
  79. "nickName": "guest" + val.OpenID,
  80. }
  81. rs := Login(url, params, token)
  82. if !code.IsFail(rs) {
  83. start(val, token, url)
  84. }
  85. //singInList(val, token, url)
  86. //singIn(val, token,url)
  87. }
  88. func RegisterDevAccount(url string, val *param.LoginReq) string {
  89. requestURL := fmt.Sprintf("%s/auth", url)
  90. params := map[string]interface{}{
  91. "pid": val.Pid,
  92. "openid": val.OpenID,
  93. "platform": val.Platform,
  94. "channel": val.Channel,
  95. }
  96. jsonBytes, _, err := mhayaHttp.PostJSON(requestURL, params)
  97. if err != nil {
  98. mhayaLogger.Warn(err)
  99. return ""
  100. }
  101. rsp := &code.Result{}
  102. err = jsoniter.Unmarshal(jsonBytes, rsp)
  103. if err != nil {
  104. mhayaLogger.Warn(err)
  105. return ""
  106. }
  107. if rsp.Code == 0 {
  108. mhayaLogger.Debugf("register account = %v, result = %v", val.OpenID, rsp)
  109. return rsp.Data.(string)
  110. }
  111. return ""
  112. }
  113. func start(val *param.LoginReq, token string, url string) {
  114. requestURL := fmt.Sprintf("%s/start", url)
  115. params := map[string]interface{}{
  116. "pid": val.Pid,
  117. "openId": val.OpenID,
  118. }
  119. execute("start", requestURL, params, token)
  120. }
  121. func singInList(val *param.LoginReq, token string, url string) {
  122. requestURL := fmt.Sprintf("%s/signInList", url)
  123. params := map[string]interface{}{}
  124. execute("signInList", requestURL, params, token)
  125. }
  126. func singIn(val *param.LoginReq, token string, url string) {
  127. requestURL := fmt.Sprintf("%s/signIn", url)
  128. params := map[string]interface{}{}
  129. execute("signIn", requestURL, params, token)
  130. }
  131. func rank(val *param.LoginReq, token string, url string) {
  132. requestURL := fmt.Sprintf("%s/rank", url)
  133. params := map[string]interface{}{
  134. "id": 1,
  135. "tp": 1,
  136. }
  137. execute("rank", requestURL, params, token)
  138. }
  139. func inviteRewardRatio(val *param.LoginReq, token string, url string) {
  140. requestURL := fmt.Sprintf("%s/inviteRewardRatio", url)
  141. params := map[string]interface{}{}
  142. execute("inviteRewardRatio", requestURL, params, token)
  143. }
  144. func inviteNodeReward(val *param.LoginReq, token string, url string) {
  145. requestURL := fmt.Sprintf("%s/inviteNodeReward", url)
  146. params := map[string]interface{}{}
  147. execute("inviteNodeReward", requestURL, params, token)
  148. }
  149. func itemWeekRecord(val *param.LoginReq, token string, url string) {
  150. requestURL := fmt.Sprintf("%s/itemWeekRecord", url)
  151. params := map[string]interface{}{}
  152. execute("itemWeekRecord", requestURL, params, token)
  153. }
  154. func inviteRewardRatioHistory(val *param.LoginReq, token string, url string) {
  155. requestURL := fmt.Sprintf("%s/inviteRewardRatioHistory", url)
  156. params := map[string]interface{}{}
  157. execute("inviteRewardRatioHistory", requestURL, params, token)
  158. }
  159. func countryRank(val *param.LoginReq, token string, url string) {
  160. requestURL := fmt.Sprintf("%s/countryRank", url)
  161. params := map[string]interface{}{}
  162. execute("countryRank", requestURL, params, token)
  163. }
  164. func claim(val *param.LoginReq, token string, url string) {
  165. requestURL := fmt.Sprintf("%s/claim", url)
  166. params := map[string]interface{}{}
  167. execute("claim", requestURL, params, token)
  168. }
  169. func Login(url string, params map[string]interface{}, token string) int32 {
  170. requestURL := fmt.Sprintf("%s/login", url)
  171. jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
  172. if err != nil {
  173. mhayaLogger.Warnf("login err: %v", err)
  174. return 1
  175. }
  176. rsp := &code.Result{}
  177. err = jsoniter.Unmarshal(jsonBytes, rsp)
  178. if err != nil {
  179. mhayaLogger.Warnf("login Unmarshal err :%v ", err)
  180. return 1
  181. }
  182. if rsp.Code == 0 {
  183. mhayaLogger.Debugf("Login OK : %v", rsp.Code)
  184. return 0
  185. } else {
  186. mhayaLogger.Debugf("Login Fail : %v", rsp.Code)
  187. }
  188. return 1
  189. }
  190. func execute(handler string, url string, params map[string]interface{}, token string) {
  191. //requestURL := fmt.Sprintf("%s/start", url)
  192. jsonBytes, err := mhayaHttp.PostJSONWithHeader(url, params, token)
  193. if err != nil {
  194. mhayaLogger.Warn(err)
  195. return
  196. }
  197. rsp := &code.Result{}
  198. err = jsoniter.Unmarshal(jsonBytes, rsp)
  199. if err != nil {
  200. mhayaLogger.Warn(err)
  201. return
  202. }
  203. mhayaLogger.Debugf("%s parms =%v", handler, params)
  204. mhayaLogger.Debugf("%s rsp =%v", handler, rsp)
  205. }
  206. func Invite(url string, params map[string]interface{}, token string) {
  207. requestURL := fmt.Sprintf("%s/invite", url)
  208. jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
  209. if err != nil {
  210. mhayaLogger.Warn(err)
  211. return
  212. }
  213. rsp := &code.Result{}
  214. err = jsoniter.Unmarshal(jsonBytes, rsp)
  215. if err != nil {
  216. mhayaLogger.Warn(err)
  217. return
  218. }
  219. mhayaLogger.Debugf("Invite %v", params)
  220. }
  221. //func RunRobot1(url, pid, userName, password, addr string, serverId int32, printLog bool) *Robot {
  222. // // 创建客户端
  223. // cli := New(
  224. // pomeloClient.New(
  225. // pomeloClient.WithRequestTimeout(10*time.Second),
  226. // pomeloClient.WithErrorBreak(true),
  227. // ),
  228. // )
  229. // cli.PrintLog = printLog
  230. //
  231. // // 登录获取token
  232. // if err := cli.GetToken(url, pid, userName, password); err != nil {
  233. // mhayaLogger.Error(err)
  234. // return nil
  235. // }
  236. //
  237. // // 根据地址连接网关
  238. // if err := cli.ConnectToTCP(addr); err != nil {
  239. // mhayaLogger.Error(err)
  240. // return nil
  241. // }
  242. //
  243. // if cli.PrintLog {
  244. // mhayaLogger.Infof("tcp connect %s is ok", addr)
  245. // }
  246. //
  247. // // 随机休眠
  248. // cli.RandSleep()
  249. //
  250. // // 用户登录到游戏节点
  251. // err := cli.UserLogin(serverId)
  252. // if err != nil {
  253. // mhayaLogger.Warn(err)
  254. // return nil
  255. // }
  256. //
  257. // if cli.PrintLog {
  258. // mhayaLogger.Infof("user login is ok. [user = %s, serverId = %d]", userName, serverId)
  259. // }
  260. //
  261. // //cli.RandSleep()
  262. //
  263. // // 查看是否有角色
  264. // err = cli.PlayerSelect()
  265. // if err != nil {
  266. // mhayaLogger.Warn(err)
  267. // return nil
  268. // }
  269. //
  270. // //cli.RandSleep()
  271. //
  272. // // 创建角色
  273. // err = cli.ActorCreate()
  274. // if err != nil {
  275. // mhayaLogger.Warn(err)
  276. // return nil
  277. // }
  278. //
  279. // //cli.RandSleep()
  280. //
  281. // // 角色进入游戏
  282. // err = cli.ActorEnter()
  283. // if err != nil {
  284. // mhayaLogger.Warn(err)
  285. // return nil
  286. // }
  287. //
  288. // elapsedTime := cli.StartTime.DiffInMillisecond(mhayaTime.Now())
  289. // mhayaLogger.Debugf("[%s] is enter to database. elapsed time:%dms", cli.TagName, elapsedTime)
  290. //
  291. // //cli.Disconnect()
  292. //
  293. // return cli
  294. //}