关于skynet_fly的一键构建服务配置

为什么要做这个?

  1. skynet启动用的skynet_config新增一个目录都要去增加一个path并重启,我就想有没有办法不用手写path,用脚本写。
  2. 热更服务的path如果有新增模块引入,之前没有埋伏路径,增加了新路径,岂不是会找不到,很难受,这样。
  3. 新增一个服务模块每次都有手写一个config好麻烦。
  4. 热更服务需要通过curl连接 debug_console服务去执行热更。

所以这个事情必须要做。

实现思路

本想着能不能像go-zero框架实现一个类似一键生成工具。但是我觉得这样还要安装一个工具挺麻烦的,就直接用shell+lua的方式来写,自带的环境,方便执行。
实现时,不知道使用者要把skynet_fly放在那个文件夹,所有考虑了skynet_fly可以放在同磁盘任意文件夹下。
构建一个服务需要在服务根目录执行使用skynet_fly_path/binshell/ skynet_fly_path svr_name thread构建。
比如如何是examples/webapp,你就需要先cd到examples/webapp,执行sh ../../binshell/make_server.sh ../../
然后就会生成webapp_config.lua script一系列执行脚本。
实现细节写在 scriptbinshell文件夹下。

  • 关于生成skynet_config
    path路径生成规则都是由近到远的查找规则, 优先级 本服务svr下文件下 > skynet_fly文件夹 > skynet文件夹
  • cpath c服务模块查找 写死skynet_fly_path/cservice/?.so; .. skynet_path/cservice/?.so;
  • lua_cpath c模块查找 写死skynet_fly_path .. "luaclib/?.so;" .. skynet_path .. "luaclib/?.so;"
  • luaservice c服务查找 写死server_path .. “?.lua;” ..
    server_path .. “service/?.lua;” ..
    skynet_fly_path .. “service/?.lua;” ..
    common_path .. “service/?.lua;” ..
    skynet_path .. “service/?.lua;”,
  • lua_path 动态生成构建。

构建查找规则如下图


以chinese_chess(server)为例。
lua_path 查找优先级为:

  1. 递归查找chinese_chess文件夹下非service文件夹
  2. 递归查找common文件夹下非service文件夹
  3. 递归查找skynet_fly/lualib
  4. 递归查找skynet_fly/3rd
  5. 递归查找skynet_fly/skynet/lualib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
--创建 lua文件 查找规则,优先级 server下非service文件夹 > server上上级目录common文件夹非service文件夹 > skynet_fly lualib下所有文件夹 > skynet lualib下所以文件夹
function M.create_luapath(skynet_fly_path)
local server_path = './'
local skynet_path = skynet_fly_path .. '/skynet'
local common_path = '../../common'

--server下非service文件夹
local lua_path = server_path .. '?.lua;\n'
for file_name,file_path,file_info in M.diripairs(server_path) do
if file_info.mode == 'directory' and file_name ~= 'service' then
lua_path = lua_path .. file_path .. '/?.lua;\n'
end
end

--server上上级目录common所有文件夹
lua_path = lua_path .. common_path .. '?.lua;\n'
for file_name,file_path,file_info in M.diripairs(common_path) do
if file_info.mode == 'directory' and file_name ~= 'service' then
lua_path = lua_path .. file_path .. '/?.lua;\n'
end
end

--skynet_fly lualib下所有文件夹
lua_path = lua_path .. skynet_fly_path .. '/lualib/?.lua;\n'
for file_name,file_path,file_info in M.diripairs(skynet_fly_path .. '/lualib') do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;\n'
end
end

--skynet_fly 3rd下所以文件夹
for file_name,file_path,file_info in M.diripairs(skynet_fly_path .. '/3rd') do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;\n'
end
end

--skynet lualib下所以文件夹
lua_path = lua_path .. skynet_path .. '/lualib/?.lua;\n'
for file_name,file_path,file_info in M.diripairs(skynet_path .. '/lualib') do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;\n'
end
end

return lua_path
end

skynet_fly服务启动时会加载lualib/preload.lua文件,我在那里做了重新构建新的luapath,再也不用手写path啦
同时热更服务也不用担心新加的路径没有写到path中。

  • 构建运维脚本
    skynet_fly会生成run.sh,restart.sh,kill_mod.sh,check_reload.sh,stop.sh一系列脚本,方便运维管理。
    其中run.sh执行之后会生成logrotate的日志切割配置,重命名方式。通过发送hup信号。
    重点讲一下check_reload.sh

check_reload.sh

  • 检测可热更服务在关闭skynet.codecache之后require的lua模块是否有修改,检测的是文件最后修改时间。
  • 对比mod_config.lua 和mod_config.lua.old 是否有改变。
    如果有改动更新对应模块。
  • 对比mod_config.lua 和mod_config.lua.old 是否有模块配置删除,有的话通知下线。

其他脚本都好理解。

如何使用

构建一个服务需要在服务根目录执行使用skynet_fly_path/binshell/ skynet_fly_path svr_name thread构建。
比如构建examples/webapp,你就需要先cd到examples/webapp,如何执行sh ../../binshell/make_server.sh ../../

调用 binshell/make_server.sh 传入1个参数。
skynetfly_path的相对路径。

总结

后续可能增加一键构建服务模板,一键构建db model等等。
skynetfly源码地址


关于skynet_fly的一键构建服务配置
https://huahua132.github.io/2023/06/30/skynet_fly_ss/关于skynet_fly的一键构建服务配置/
作者
huahua132
发布于
2023年6月30日
许可协议