skynet有两种方法支持热更新lua代码:clearcache和inject,在介绍skynet热更新机制之前,先介绍skynet控制台,参考官方wiki https://github.com/cloudwu/skynet/wiki/DebugConsole
1. skynet控制台
想要使用skynet控制台,需启动debug_console服务skynet.newservice("debug_console", ip, port),指定一个地址。skynet启动后,用nc命令就可以进入控制台,如图。
debug_console服务启动后,监听外部连接(第3行)。
第15行,当打开控制台连接建立后,fork一个协程在console_main_loop里处理这个tcp连接的通信交互
第6-13行,使用特定的print,数据不是输出到屏幕上,而是通过socket.write发送给控制台
第24-28行,获取控制台发来的数据,然后调用docmd
第35-52行,解析出相应指令,执行完后,通过print发送给控制台
-- service/debug_console.lua
skynet.start(function()
local listen_socket = socket.listen (ip, port)
skynet.error("Start debug console at " .. ip .. ":" .. port)
socket.start(listen_socket , function(id, addr)
local function print(...)
local t = { ... }
for k,v in ipairs(t) do
t[k] = tostring(v)
end
socket.write(id, table.concat(t,"\t"))
socket.write(id, "\n")
end
socket.start(id)
skynet.fork(console_main_loop, id , print)
end)
end)
local function console_main_loop(stdin, print)
print("Welcome to skynet console")
skynet.error(stdin, "connected")
local ok, err = pcall(function()
while true do
local cmdline = socket.readline(stdin, "\n")
...
if cmdline ~= "" then
docmd(cmdline, print, stdin)
end
end
end)
...
end
local function docmd(cmdline, print, fd)
local split = split_cmdline(cmdline)
local command = split[1]
local cmd = COMMAND[command]
local ok, list
if cmd then
ok, list = pca