srvSteward.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. -- 管家服务
  2. require "skynet.manager"
  3. local skynet = require "skynet"
  4. local cluster = require "skynet.cluster"
  5. local codecache = require "skynet.codecache"
  6. local nodeUtil = require("utils.nodeUtil")
  7. local nodes = require("nodes")
  8. local baseService = require("baseService")
  9. local hotfixHelper = require("hotfix.helper")
  10. local SERVICES = {}
  11. local root = {}
  12. local clusterName = skynet.getenv("clusterName")
  13. local nodeName = skynet.getenv("nodeName")
  14. -- 服务退出
  15. local function l_service_exit()
  16. if #SERVICES > 0 then
  17. local needWait
  18. for _, v in ipairs(SERVICES) do
  19. if not v.NoClose then
  20. needWait = true
  21. skynet.send(v.addr, "lua", "exit")
  22. end
  23. end
  24. if needWait then
  25. return
  26. end
  27. end
  28. -- 服务全部退出 进程关闭
  29. skynet.abort()
  30. end
  31. -- 服务 - 开启
  32. function root.start_service(addr, name, remote, exitLevel, NoClose)
  33. table.insert(SERVICES, {addr = addr, name = name, exitLevel = exitLevel or 1, NoClose = NoClose})
  34. if remote then
  35. cluster.register(name, addr)
  36. end
  37. end
  38. -- 服务 - 停止
  39. function root.stop_service(addr)
  40. local sindex, exitLevel = nil, nil
  41. for k, v in ipairs(SERVICES) do
  42. if v.addr == addr then
  43. sindex = k
  44. exitLevel = v.exitLevel
  45. end
  46. end
  47. if not sindex then
  48. return
  49. end
  50. table.remove(SERVICES, sindex)
  51. local sameLevelExit = true
  52. for _, v in ipairs(SERVICES) do
  53. if v.exitLevel == exitLevel and not v.NoClose then
  54. sameLevelExit = false
  55. break
  56. end
  57. end
  58. if not sameLevelExit then
  59. return
  60. end
  61. -- 同等级都退出了,再退出下一个等级的服务
  62. l_service_exit()
  63. end
  64. -- 更新配置表
  65. function root.update_config()
  66. codecache.clear()
  67. local addr = skynet.localname(".config")
  68. if not addr then
  69. return
  70. end
  71. local files = skynet.call(".config", "lua", "get_update_files")
  72. if not files then
  73. return
  74. end
  75. -- 向非配置服务发送更新配置表请求
  76. for _, v in ipairs(SERVICES) do
  77. if v.name ~= ".config" then
  78. skynet.send(v.addr, "lua", "update_config", table.unpack(files))
  79. end
  80. end
  81. end
  82. -- 更新协议
  83. function root.update_proto()
  84. codecache.clear()
  85. local addr = skynet.localname(".srvProtoLoad")
  86. if not addr then
  87. return
  88. end
  89. skynet.call(".srvProtoLoad", "lua", "update_proto")
  90. local currAddr = skynet.self()
  91. for _, v in ipairs(SERVICES) do
  92. if v.addr ~= currAddr then
  93. skynet.send(v.addr, "lua", "update_proto")
  94. end
  95. end
  96. end
  97. -- 更新逻辑
  98. function root.update_logic()
  99. codecache.clear()
  100. local files = hotfixHelper.getChanggeFiles()
  101. if table.empty(files) then
  102. return
  103. end
  104. local currAddr = skynet.self()
  105. for _, v in ipairs(SERVICES) do
  106. if v.addr ~= currAddr then
  107. skynet.send(v.addr, "lua", "update_logic", files)
  108. end
  109. end
  110. end
  111. -- 更新所有
  112. function root.update()
  113. root.update_config()
  114. root.update_logic()
  115. root.update_proto()
  116. end
  117. function root.exit()
  118. -- 退出优先级 退出等级小, 服务地址大
  119. table.sort(
  120. SERVICES,
  121. function(a, b)
  122. if a.exitLevel == b.exitLevel then
  123. return a.addr > b.addr
  124. end
  125. return a.exitLevel < b.exitLevel
  126. end
  127. )
  128. l_service_exit()
  129. end
  130. function root.onStart()
  131. return true
  132. end
  133. -- 心跳
  134. function root.node_hb_to_master(nodeMaster)
  135. if nodes[nodeName] == nil then
  136. return
  137. end
  138. nodeMaster = nodeMaster or "master"
  139. local nodeInfo = table.copy(nodes[nodeName])
  140. nodeInfo.clusterName = clusterName
  141. nodeInfo.nodeName = nodeName
  142. skynet.fork(
  143. function(...)
  144. while true do
  145. nodeUtil:send_to_node(nodeMaster, ".srvNodeMgr", "node_heart_beat", nodeInfo)
  146. skynet.sleep(5 * 100)
  147. end
  148. end
  149. )
  150. end
  151. baseService.start(root, ".steward", true)