MiddleConnect.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. -- 跨服鏈接和重连管理
  2. local msg_parse = _G.msg_inner_parse
  3. local Config = require("Config")
  4. local Log = require("common.Log")
  5. local CommonDB = require("common.CommonDB")
  6. local InnerMsg = require("core.InnerMsg")
  7. local MiddleManager = require("middle.MiddleManager")
  8. local MiddleHeartBeat = require("middle.MiddleHeartBeat")
  9. local Define = require("platform.Define")
  10. local Json = require("common.Json")
  11. local JjcLadderMiddle = require("jjcLadder.JjcLadderMiddle")
  12. IS_MIDDLE_CONNECT = IS_MIDDLE_CONNECT or nil -- 是否連上跨服 收到WLhello才認為連上了
  13. YY_ACT_FLAG = nil
  14. -- 请求middleInfo
  15. local s2aParam = {}
  16. local function questMiddleInfo()
  17. s2aParam.sid = Config.SVR_INDEX
  18. s2aParam.api_cbMethod = "setMiddleInfo"
  19. _G.thread_http.send(Define.MIDDLE_INFO_URL, Json.Encode(s2aParam))
  20. end
  21. function setMiddleInfo(ip, port, host)
  22. if _G.is_middle == true then return end
  23. local middleDBInfo = CommonDB.getMiddleInfo()
  24. if middleDBInfo.ip == ip and middleDBInfo.port == port and middleDBInfo.host == host then
  25. -- 沒變化
  26. return
  27. end
  28. local oldIp = middleDBInfo.ip
  29. local oldPort = middleDBInfo.port
  30. CommonDB.setMiddleInfo(ip, port, host)
  31. if oldIp == ip and oldPort == port then
  32. -- 只有host变了 不需要重連
  33. return
  34. else
  35. tryConnectMiddle(ip, port) -- try的時候會把之前的鏈接斷開
  36. end
  37. end
  38. function getMiddleInfo()
  39. --调试模式使用配置的IP
  40. if Config.IS_DEBUG then
  41. return Config.MIDDLE_IP, Config.MIDDLE_PORT, Config.MIDDLE_HOST
  42. end
  43. local middleDBInfo = CommonDB.getMiddleInfo()
  44. return middleDBInfo.ip, middleDBInfo.port, middleDBInfo.host
  45. end
  46. function initAfterStart()
  47. onTimer() -- 啟動拉取一下middleInfo
  48. end
  49. function onTimer()
  50. if _G.is_middle == true then return end
  51. -- 如果没有middleip 去找后台请求middleip 1分钟1次
  52. local ip, port = getMiddleInfo()
  53. if ip == nil then
  54. -- reyes todo get ip
  55. print("no middleInfo try to get")
  56. questMiddleInfo()
  57. return
  58. end
  59. -- 如果ip有了 但是一直没连上 1分钟重连1次
  60. if isConnect() ~= true then
  61. tryConnectMiddle(ip, port)
  62. return
  63. end
  64. -- 如果3分钟之内 没有收到middle的心跳包 并且底层还是连接中的状态 我们认为出故障了 这个时候重连一下middle 这是一个异常处理
  65. if MiddleHeartBeat.LAST_HEARTBEAT_TIME then
  66. local now = os.time()
  67. if now - MiddleHeartBeat.LAST_HEARTBEAT_TIME > 180 then
  68. stopConnectMiddle()
  69. end
  70. end
  71. end
  72. function autoResetMiddle()
  73. if _G.is_middle == true then return end
  74. -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
  75. CommonDB.setMiddleInfo(nil, nil, nil)
  76. stopConnectMiddle()
  77. onTimer() -- 拉取一下middleInfo
  78. end
  79. function isConnect()
  80. -- 這個接口和IS_MIDDLE_CONNECT的區別是 這個表示底層鏈接連上了 但是不一定正確收到了middle會包 lua層業務判斷最好別用這個接口 盡量用IS_MIDDLE_CONNECT
  81. local ret = msg_parse.check_connect()
  82. if ret == true then
  83. return true
  84. end
  85. end
  86. function tryConnectMiddle(ip, port)
  87. print("try connect middle ", ip, port)
  88. Log.write(Log.LOGID_INNER_CLOSE, "tryConnectMiddle", ip, port)
  89. msg_parse.set_connect(ip, port)
  90. end
  91. function stopConnectMiddle()
  92. print("stop connect middle ")
  93. Log.write(Log.LOGID_INNER_CLOSE, "stopConnectMiddle")
  94. msg_parse.close_connect()
  95. IS_MIDDLE_CONNECT = nil
  96. MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
  97. MiddleHeartBeat.LAST_SEND_HB_TS = nil
  98. end
  99. function LW_HELLO(fd, msg)
  100. print("LW Hello")
  101. Log.write(Log.LOGID_INNER_CLOSE, "LW_HELLO")
  102. MiddleManager.addLogicServer(fd, msg.svrIndex)
  103. local msg = InnerMsg.wl.WL_HELLO
  104. InnerMsg.sendMsg(fd, msg)
  105. msg = InnerMsg.wl.WL_HEARTBEAT
  106. InnerMsg.sendMsg(fd, msg)
  107. -- 同步其它信息
  108. JjcLadderMiddle.sendWLMobaiCnt(fd)
  109. end
  110. function WL_HELLO(fd, msg)
  111. print("WL hello")
  112. Log.write(Log.LOGID_INNER_CLOSE, "WL_HELLO")
  113. if not IS_MIDDLE_CONNECT then
  114. print("middle server upup!!!---")
  115. IS_MIDDLE_CONNECT = true
  116. local openTime = CommonDB.getServerOpenTime()
  117. if openTime ~= 0 then
  118. local msg = InnerMsg.lw.LW_SET
  119. msg.openTime = openTime or 0
  120. msg.svrIndex = Config.SVR_INDEX
  121. InnerMsg.sendMsg(fd, msg)
  122. end
  123. end
  124. end
  125. function LW_SET(fd,msg)
  126. MiddleManager.setServerOpenDay(fd,msg.svrIndex,msg.openTime)
  127. end
  128. function LW_DISCONNECT(fd, msg)
  129. print("LW_DISCONNECT")
  130. MiddleManager.delLogicServer(fd)
  131. end
  132. --middle断线,C++层触发
  133. function WL_DISCONNECT(fd, msg)
  134. if IS_MIDDLE_CONNECT then
  135. IS_MIDDLE_CONNECT = nil
  136. MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
  137. MiddleHeartBeat.LAST_SEND_HB_TS = nil
  138. Log.write(Log.LOGID_INNER_CLOSE, "middle server disconnect!!!")
  139. print("middle server disconnect!!!---")
  140. end
  141. end