关于skynet_fly的一键构建服务配置
为什么要做这个?
- skynet启动用的skynet_config新增一个目录都要去增加一个path并重启,我就想有没有办法不用手写path,用脚本写。
- 热更服务的path如果有新增模块引入,之前没有埋伏路径,增加了新路径,岂不是会找不到,很难受,这样。
- 新增一个服务模块每次都有手写一个config好麻烦。
- 热更服务需要通过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一系列执行脚本。
实现细节写在 script
和binshell
文件夹下。
- 关于生成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 查找优先级为:
- 递归查找chinese_chess文件夹下非service文件夹
- 递归查找common文件夹下非service文件夹
- 递归查找skynet_fly/lualib
- 递归查找skynet_fly/3rd
- 递归查找skynet_fly/skynet/lualib
1 |
|
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源码地址