Node(节点)
每个moon
进程都是一个Node
, 每个Node
通过组合不同功能的服务
来组成特定类型的进程(游戏逻辑服, 跨服战场),不同的Node
组成游戏服务器集群。使用如下命令就创建一个Node
:
moon script.lua [args...]
script.lua
被称为启动脚本,同时它也是初始化第一个服务的脚本。第一个服务被称为bootstrap
服务,它有一些特殊性,通常用来创建和管理其它唯一服务
, 和控制节点进程的退出流程,将会在服务部分详细介绍。
信息
moon启动后会把工作目录
切换到script.lua
所在的路径,方便后续加载脚本和配置文件。
Node进程创建
启动脚本可以分为默认启动
和配置初始化参数
, 这里先介绍默认启动
的方式,配置初始化参数
会在节点间通信
部分详细介绍。如下示例就是按默认启动
方式创建一个节点, 把下面代码保存成文件node.lua
, 放在moon可执行文件同级目录, 使用moon node.lua a b c
运行.
local moon = require("moon")
local arg = moon.args()
moon.async(function ()
moon.sleep(100)
print("hello world: ", table.concat(arg, " "))
moon.quit()
end)
输出
2023-07-23 17:40:04.922 | :01000001 | INFO | [WORKER 1] new service [bootstrap]
2023-07-23 17:40:04.922 | 42432 | INFO | WORKER-20 START
2023-07-23 17:40:05.025 | :01000001 | INFO | hello world: a b c (node.lua:5)
2023-07-23 17:40:05.025 | :01000001 | INFO | [WORKER 1] destroy service [bootstrap]
Node进程退出
主要API
--- 注册进程退出信号处理函数, 需要在处理函数中主动调用`moon.quit`, 否则服务不会退出。
--- 可以开启新的协程执行异步逻辑: 如服务器安全关闭流程, 等待服务按指定顺序关闭, 保存数据等。
--- **对于唯一服务一般需要注册此函数来处理退出流程,或者使用`moon.kill`强制关闭**
---@param callback fun()
function moon.shutdown(callback)
cb_shutdown = callback
end
---触发进程退出流程
moon.exit(exit_code)
- 如果
exit_code<0
, Node进程会直接退出,不会触发moon.shutdown
回调。
local moon = require("moon")
print("hello world")
moon.exit(-1)
moon.shutdown(function ()
print("shutdown") ---不会打印这一行
moon.quit() --退出
end)
- 如果
exit_code>=0
, 会给Node进程内所有服务发送shutdown
消息, 等没有服务存活时, 进程才会退出。可以注册moon.shutdown
回调自定义退出逻辑。唯一服务
moon.shutdown
回调的默认行为是空,所以需要主动调用moon.quit()
来退出, 通常是在bootstrap
服务中控制唯一服务
的退出顺序, 对于大部分游戏服务器,唯一服务
的退出顺序是很重要的。 对于普通服务
moon.shutdown
回调的默认行为是调用moon.quit()
, 如果要自己管理普通服务
的退出,可以覆盖掉moon.shutdown
的默认行为。
local moon = require("moon")
print("hello world")
moon.exit(0)
moon.shutdown(function ()
print("shutdown") ---会打印这一行
moon.quit() --退出
end)
bootstrap
服务初始化失败时会自动调用moon.exit(-1)
main
函数会返回对应的exit_code
退出码, 方便进程管理工具判断是否启动成功