main.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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. "strconv"
  11. "sync"
  12. "time"
  13. )
  14. func main() {
  15. // 定义命令行标志
  16. userOffset := flag.Int("userOffset", 150, "用户偏移量")
  17. count := flag.Int("count", 30, "请求总数")
  18. qps := flag.Int("qps", 1, "最大并发数")
  19. //url := flag.String("url", "http://127.0.0.1:20000", "请求url")
  20. url1 := flag.String("url1", "http://127.0.0.1:20000", "请求url")
  21. //url2 := flag.String("url2", "http://127.0.0.1:20002", "请求url")
  22. //url3 := flag.String("url3", "http://127.0.0.1:20003", "请求url")
  23. duration := flag.Int("duration", 30, "测试持续时间")
  24. flag.Parse()
  25. startTime := time.Now()
  26. var wg sync.WaitGroup
  27. wg.Add(*count)
  28. // 创建一个 channel 来控制请求的速率
  29. reqCh := make(chan struct{}, *qps)
  30. // 控制请求速率的 goroutine
  31. go func() {
  32. ticker := time.NewTicker(time.Second / time.Duration(*qps))
  33. defer ticker.Stop()
  34. for range ticker.C {
  35. reqCh <- struct{}{}
  36. }
  37. }()
  38. // 发送请求的 goroutine
  39. go func() {
  40. for i := *userOffset; i < *count+*userOffset; i++ {
  41. <-reqCh
  42. go func() {
  43. defer wg.Done()
  44. str := strconv.Itoa(i)
  45. account := &param.LoginReq{
  46. Pid: 2,
  47. OpenID: str,
  48. Platform: "ios",
  49. Channel: "tg",
  50. }
  51. RunRobot(*url1, account, i)
  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. Invite(url, token)
  86. Claim(url, token)
  87. //singInList(val, token, url)
  88. //singIn(val, token,url)
  89. }
  90. func RegisterDevAccount(url string, val *param.LoginReq) string {
  91. requestURL := fmt.Sprintf("%s/auth", url)
  92. params := map[string]interface{}{
  93. "pid": val.Pid,
  94. "openid": val.OpenID,
  95. "platform": val.Platform,
  96. "channel": val.Channel,
  97. }
  98. jsonBytes, _, err := mhayaHttp.PostJSON(requestURL, params)
  99. if err != nil {
  100. mhayaLogger.Warn(err)
  101. return ""
  102. }
  103. rsp := &code.Result{}
  104. err = jsoniter.Unmarshal(jsonBytes, rsp)
  105. if err != nil {
  106. mhayaLogger.Warn(err)
  107. return ""
  108. }
  109. if rsp.Code == 0 {
  110. mhayaLogger.Debugf("register account = %v, result = %v", val.OpenID, rsp)
  111. return rsp.Data.(string)
  112. }
  113. return ""
  114. }
  115. func start(val *param.LoginReq, token string, url string) {
  116. requestURL := fmt.Sprintf("%s/start", url)
  117. params := map[string]interface{}{
  118. "pid": val.Pid,
  119. "openId": val.OpenID,
  120. }
  121. execute("start", requestURL, params, token)
  122. }
  123. func singInList(val *param.LoginReq, token string, url string) {
  124. requestURL := fmt.Sprintf("%s/signInList", url)
  125. params := map[string]interface{}{}
  126. execute("signInList", requestURL, params, token)
  127. }
  128. func singIn(val *param.LoginReq, token string, url string) {
  129. requestURL := fmt.Sprintf("%s/signIn", url)
  130. params := map[string]interface{}{}
  131. execute("signIn", requestURL, params, token)
  132. }
  133. func rank(val *param.LoginReq, token string, url string) {
  134. requestURL := fmt.Sprintf("%s/rank", url)
  135. params := map[string]interface{}{
  136. "id": 1,
  137. "tp": 1,
  138. }
  139. execute("rank", requestURL, params, token)
  140. }
  141. func inviteRewardRatio(val *param.LoginReq, token string, url string) {
  142. requestURL := fmt.Sprintf("%s/inviteRewardRatio", url)
  143. params := map[string]interface{}{}
  144. execute("inviteRewardRatio", requestURL, params, token)
  145. }
  146. func inviteNodeReward(val *param.LoginReq, token string, url string) {
  147. requestURL := fmt.Sprintf("%s/inviteNodeReward", url)
  148. params := map[string]interface{}{}
  149. execute("inviteNodeReward", requestURL, params, token)
  150. }
  151. func itemWeekRecord(val *param.LoginReq, token string, url string) {
  152. requestURL := fmt.Sprintf("%s/itemWeekRecord", url)
  153. params := map[string]interface{}{}
  154. execute("itemWeekRecord", requestURL, params, token)
  155. }
  156. func inviteRewardRatioHistory(val *param.LoginReq, token string, url string) {
  157. requestURL := fmt.Sprintf("%s/inviteRewardRatioHistory", url)
  158. params := map[string]interface{}{}
  159. execute("inviteRewardRatioHistory", requestURL, params, token)
  160. }
  161. func countryRank(val *param.LoginReq, token string, url string) {
  162. requestURL := fmt.Sprintf("%s/countryRank", url)
  163. params := map[string]interface{}{}
  164. execute("countryRank", requestURL, params, token)
  165. }
  166. func claim(val *param.LoginReq, token string, url string) {
  167. requestURL := fmt.Sprintf("%s/claim", url)
  168. params := map[string]interface{}{
  169. "pid": val.Pid,
  170. "openId": val.OpenID,
  171. }
  172. execute("claim", requestURL, params, token)
  173. }
  174. func Login(url string, params map[string]interface{}, token string) int32 {
  175. requestURL := fmt.Sprintf("%s/login", url)
  176. jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
  177. if err != nil {
  178. mhayaLogger.Warnf("login err: %v", err)
  179. return 1
  180. }
  181. rsp := &code.Result{}
  182. err = jsoniter.Unmarshal(jsonBytes, rsp)
  183. if err != nil {
  184. mhayaLogger.Warnf("login Unmarshal err :%v ", err)
  185. return 1
  186. }
  187. if rsp.Code == 0 {
  188. mhayaLogger.Debugf("Login OK : %v", rsp.Code)
  189. return 0
  190. } else {
  191. mhayaLogger.Debugf("Login Fail : %v", rsp.Code)
  192. }
  193. return 1
  194. }
  195. func execute(handler string, url string, params map[string]interface{}, token string) {
  196. //requestURL := fmt.Sprintf("%s/start", url)
  197. jsonBytes, err := mhayaHttp.PostJSONWithHeader(url, params, token)
  198. if err != nil {
  199. mhayaLogger.Warn(err)
  200. return
  201. }
  202. rsp := &code.Result{}
  203. err = jsoniter.Unmarshal(jsonBytes, rsp)
  204. if err != nil {
  205. mhayaLogger.Warn(err)
  206. return
  207. }
  208. mhayaLogger.Debugf("%s parms =%v", handler, params)
  209. mhayaLogger.Debugf("%s rsp =%v", handler, rsp)
  210. }
  211. func Invite(url string, token string) {
  212. requestURL := fmt.Sprintf("%s/invite", url)
  213. params := map[string]interface{}{
  214. "parentName": "cabc2Xf1La3recbQf2Nc9d5f2Ac1",
  215. }
  216. jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
  217. if err != nil {
  218. mhayaLogger.Warn(err)
  219. return
  220. }
  221. rsp := &code.Result{}
  222. err = jsoniter.Unmarshal(jsonBytes, rsp)
  223. if err != nil {
  224. mhayaLogger.Warn(err)
  225. return
  226. }
  227. mhayaLogger.Debugf("Invite %v", params)
  228. }
  229. func Claim(url string, token string) {
  230. requestURL := fmt.Sprintf("%s/claim", url)
  231. params := map[string]interface{}{
  232. "tp": 3,
  233. "id": 1000,
  234. }
  235. jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
  236. if err != nil {
  237. mhayaLogger.Warn(err)
  238. return
  239. }
  240. rsp := &code.Result{}
  241. err = jsoniter.Unmarshal(jsonBytes, rsp)
  242. if err != nil {
  243. mhayaLogger.Warn(err)
  244. return
  245. }
  246. mhayaLogger.Debugf("Claim %v", params)
  247. }
  248. //func RunRobot1(url, pid, userName, password, addr string, serverId int32, printLog bool) *Robot {
  249. // // 创建客户端
  250. // cli := New(
  251. // pomeloClient.New(
  252. // pomeloClient.WithRequestTimeout(10*time.Second),
  253. // pomeloClient.WithErrorBreak(true),
  254. // ),
  255. // )
  256. // cli.PrintLog = printLog
  257. //
  258. // // 登录获取token
  259. // if err := cli.GetToken(url, pid, userName, password); err != nil {
  260. // mhayaLogger.Error(err)
  261. // return nil
  262. // }
  263. //
  264. // // 根据地址连接网关
  265. // if err := cli.ConnectToTCP(addr); err != nil {
  266. // mhayaLogger.Error(err)
  267. // return nil
  268. // }
  269. //
  270. // if cli.PrintLog {
  271. // mhayaLogger.Infof("tcp connect %s is ok", addr)
  272. // }
  273. //
  274. // // 随机休眠
  275. // cli.RandSleep()
  276. //
  277. // // 用户登录到游戏节点
  278. // err := cli.UserLogin(serverId)
  279. // if err != nil {
  280. // mhayaLogger.Warn(err)
  281. // return nil
  282. // }
  283. //
  284. // if cli.PrintLog {
  285. // mhayaLogger.Infof("user login is ok. [user = %s, serverId = %d]", userName, serverId)
  286. // }
  287. //
  288. // //cli.RandSleep()
  289. //
  290. // // 查看是否有角色
  291. // err = cli.PlayerSelect()
  292. // if err != nil {
  293. // mhayaLogger.Warn(err)
  294. // return nil
  295. // }
  296. //
  297. // //cli.RandSleep()
  298. //
  299. // // 创建角色
  300. // err = cli.ActorCreate()
  301. // if err != nil {
  302. // mhayaLogger.Warn(err)
  303. // return nil
  304. // }
  305. //
  306. // //cli.RandSleep()
  307. //
  308. // // 角色进入游戏
  309. // err = cli.ActorEnter()
  310. // if err != nil {
  311. // mhayaLogger.Warn(err)
  312. // return nil
  313. // }
  314. //
  315. // elapsedTime := cli.StartTime.DiffInMillisecond(mhayaTime.Now())
  316. // mhayaLogger.Debugf("[%s] is enter to database. elapsed time:%dms", cli.TagName, elapsedTime)
  317. //
  318. // //cli.Disconnect()
  319. //
  320. // return cli
  321. //}