load_mods配置文件的使用

前言

load_mods配置文件是skynet_fly非常核心的东西。通常一个服务为了区分不同环境,都会有一个服务配置项。
传统的服务端配置可能就是key-value形式的配置项,因为大部分传统服务端都是把配置做成全局单例,方便读取。

skynet 有个启动配置,为啥还要新增一个?

  1. 因为skynet_env都是key-value形式的,而且是配置在全局变量中,不方便做配置遍历。
  2. skynet_env读取数据需要竞争自选锁,使用中应该尽量少用(尽量在代码加载阶段拿取)。
  3. 不适用于给可插拔的可热更服务编写配置。
  4. 无法热更。

配置介绍

webapp中的配置为例

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
return {
share_config_m = {
launch_seq = 1,
launch_num = 1,
default_arg = {
server_cfg = {
thread = 2,
debug_port = 9001,
}
}
},

web_agent_m = {
launch_seq = 1,
launch_num = 6,
default_arg = {
protocol = 'http',
dispatch = 'apps.webapp_dispatch',
keep_alive_time = 300, --最长保活时间
second_req_limit = 2000, --1秒内请求数量限制
}
},

web_master_m = {
launch_seq = 2,
launch_num = 1,
default_arg = {
protocol = 'http',
port = 80, --端口
max_client = 6000, --最大连接数
second_conn_limit = 2000, --相同ip 1秒内建立连接数限制
keep_live_limit = 2000, --相同ip 保持活跃数量限制
}
}
}

配置返回一个表。
表的key需要填写想要启动的可热更服务模块,就是****_m.lua文件。
表的value就是对应这个可热更服务模块的详细配置。
其中字段意义如下:

  • launch_seq 启动顺序。
  • launch_num 启动数量。
  • default_arg 默认配置。
  • mod_args 模块配置。

假设launch_num = 2,就会启动2个可热更模板服务,index 1、2
拿取配置规则为: cfg = mod_args[index] or default_arg
优先拿mod_args的专属配置,没有取默认配置。

  • delay_run 推迟运行。

可热更模块服务的启动
launcher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function M.run()
skynet.monitor('monitor_exit')
local cmgr = skynet.uniqueservice('contriner_mgr')
skynet.uniqueservice("debug_console", skynet.getenv('debug_port'))

local before_run_list = {} --先跑
local delay_run_list = {} --延迟再次调用再跑
for mod_name,mod_cfg in table_util.sort_ipairs(load_mods,function(a,b)
return a.launch_seq < b.launch_seq
end) do
if not mod_cfg.delay_run then
table.insert(before_run_list, mod_name)
else
table.insert(delay_run_list, mod_name)
end
end
local self_address = skynet.self()
skynet.call(cmgr, 'lua', 'load_modules', self_address, table.unpack(before_run_list))
return function()
if not delay_run_list then return end
skynet.call(cmgr, 'lua', 'load_modules', self_address, table.unpack(delay_run_list))
delay_run_list = nil
end
end

启动函数执行会返回需要推迟运行的函数,因为可能存在这种情况,可热更服务模块中依赖的普通skynet服务,此时就需要先启动普通skynet服务,再启动推迟运行的可热更模块服务

mod_args[index] 或者 default_arg的配置传递到哪了?

一个可热更服务模板必须定义startexit两个回调函数。

1
2
3
4
5
6
7
8
9
10
local CMD = {}

function CMD.start(config) --mod_args[index] or default_arg
return true
end

function CMD.exit()
return true
end
return CMD

可以看到,配置传递到start函数中了。

我们也可以通过加载skynet-fly.etc.module_info来获取配置信息。

module_info提供了 get_cfg()方法供获取配置。
还提供了get_base_info()供查询可热更服务的基础信息。

1
2
3
4
5
module_name = MODULE_NAME,     --模块名称  比如 web_master_m web_agent_m
index = INDEX, --启动索引 比如启动6 6个服务的索引分别 是 1 - 6
launch_date = LAUNCH_DATE, --启动日期
launch_time = LAUNCH_TIME, --启动时间戳
version = VERSION, --版本号 热更会使版本号增加

如果不是可热更服务,调用相关命令
get_cfg会返回nil
get_base_info将是一个空table。

如何区分可热更服务和普通服务

skynet_fly中,有两个特殊的全局变量。
SERVICE_NAME 是skynet启动服务名。
MODULE_NAME 是可热更模块的名称。如果一个服务中,这个值为nil,它就是一个可热更服务。


load_mods配置文件的使用
https://huahua132.github.io/2023/02/25/skynet_fly_word/word_1/E_load_mods/
作者
huahua132
发布于
2023年2月25日
许可协议