跳到主要内容

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退出码, 方便进程管理工具判断是否启动成功