Replies: 4 comments 10 replies
-
|
其实直接支持 https://github.com/cloudwu/datalist 就丰富了。只是需要一个简单的兼容手段(可能用文件后缀名区分最简单)。 |
Beta Was this translation helpful? Give feedback.
-
|
又想到了一个改动小的方案: #ifndef LOAD_CONFIG_CUSTOM
#define LOAD_CONFIG_DEFAULT \
"local result = {}\n" \
"local function getenv(name) return assert(os.getenv(name), [[os.getenv() failed: ]] .. name) end\n" \
"local sep = package.config:sub(1,1)\n" \
"local current_path = [[.]]..sep\n" \
"local function include(filename)\n" \
" local last_path = current_path\n" \
" local path, name = filename:match([[(.*]]..sep..[[)(.*)$]])\n" \
" if path then\n" \
" if path:sub(1,1) == sep then -- root\n" \
" current_path = path\n" \
" else\n" \
" current_path = current_path .. path\n" \
" end\n" \
" else\n" \
" name = filename\n" \
" end\n" \
" local f = assert(io.open(current_path .. name))\n" \
" local code = assert(f:read [[*a]])\n" \
" code = string.gsub(code, [[%$([%w_%d]+)]], getenv)\n" \
" f:close()\n" \
" assert(load(code,[[@]]..filename,[[t]],result))()\n" \
" current_path = last_path\n" \
"end\n" \
"setmetatable(result, { __index = { include = include } })\n" \
"local config_name = ...\n" \
"include(config_name)\n" \
"setmetatable(result, nil)\n" \
"return result\n"
#else
// 使用外部自定义的 LOAD_CONFIG_CUSTOM 宏
#define LOAD_CONFIG_DEFAULT LOAD_CONFIG_CUSTOM
#endif
// 定义静态常量字符串,使用宏展开的内容
static const char *load_config = LOAD_CONFIG_DEFAULT;这样可以实现编译的时候自定义LOAD_CONFIG_CUSTOM来扩展。 |
Beta Was this translation helpful? Give feedback.
-
|
又遇到一个问题了,log 服务是需要先启动的,这时候 configd 还没启动,配置读取就还是只能从 skyent.getenv 取。虽然可以先用默认配置启动,等 configd 启动后再更新配置,就是觉得有点绕。还有没有其他方案呢?把 conifgd 的逻辑放到 log 服务里实现? -- log config
logger = "logger"
logservice = "snlua"
bootfaillogpath = "logs/bootfail.log" -- 启动失败的日志文件
log_overload_mqlen = 1000000 -- 日志过载队列长度
log_src = true -- 日志是否打印代码位置
log_print_table = true -- 日志是否打印table内容
log_level = 4 -- 日志等级 DEBUG = 4, INFO = 3, WARN = 2, ERROR = 1, FATAL = 0
log_config = log_config
or [[
{
{
name = "file",
filename = "logs/skyext.log",
split = "size", -- size/line/day/hour
maxline = 10000, -- 每个文件最大行数 line split 有效
maxsize = "100M", -- 每个文件最大尺寸 size split 有效
},
{
name = "console",
}
}
]] |
Beta Was this translation helpful? Give feedback.
-
|
根据 @253980289 的配置分层建议,我也说个配置管理相关的建议,不管 Config 是否支持 table 类型,配置应该是分层管理的。分层管理更清晰也更好维护。现在我把我的 config 配置分了 2 层,一层是 skynet 内部的,一个是应用层的(非策划配置)。 配置目录结构: etc
├── app
│ ├── account1.app.lua
│ ├── account2.app.lua
│ ├── common.app.lua
│ ├── monitor.app.lua
│ ├── role1.app.lua
│ └── role2.app.lua
├── account1.conf.lua
├── account2.conf.lua
├── core.conf.lua
├── role1.conf.lua
└── role2.conf.luacore.conf.lua这里只允许配置 skynet 内置的配置,不允许配置应用层的配置。 root = "./"
luaservice = root .. "app/" .. start .. "/?.lua;"
luaservice = luaservice .. root .. "app/?/main.lua;"
luaservice = luaservice .. root .. "app/" .. start .. "/?/main.lua;"
luaservice = luaservice .. root .. "service/?.lua;"
luaservice = luaservice .. root .. "service/?/main.lua;"
luaservice = luaservice .. root .. "skynet/service/?.lua;"
lua_path = root .. "?.lua;"
lua_path = lua_path .. root .. "lualib/?.lua;"
lua_path = lua_path .. root .. "lualib/?/init.lua;"
lua_path = lua_path .. root .. "skynet/lualib/?.lua;"
lua_cpath = root .. "luaclib/?.so;"
lua_cpath = lua_cpath .. root .. "skynet/luaclib/?.so;"
cpath = root .. "skynet/cservice/?.so;"
snax = root .. "service/?.lua;"
lualoader = root .. "lualib/loader.lua"
preload = root .. "lualib/preload.lua"
thread = 8
bootstrap = "snlua bootstrap"
harbor = 0
logservice = "snlua"
logger = "logger"account1.conf.lua这是程序配置入口,也就是启动命令传入的配置文件。 app_config_path = "etc/app/account1.app.lua"
start = "account" -- main script account/main.lua
include "core.conf.lua" -- include core configapp/account2.app.lua这里就是 account 进程的配置。 log_config = {
{
name = "file",
filename = "logs/account.log",
split = "size", -- size/line/day/hour
maxsize = "100M", -- 每个文件最大尺寸 size split 有效
},
{
name = "console",
},
}
account_http_port = 8080
account_agent_count = 1
debug_console_port = 6003
snowflake_machine_id = 2
include "common.app.lua"扩展如果配置是远程的,可以配置一个远程配置服务器,然后通过 http 获取配置。 app_config_url = "http://127.0.0.1/etc/app/account1.app.lua"
start = "account" -- main script account/main.lua
include "core.conf.lua" -- include core config |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
目前我是用字符串来定义 table 类型的配置的,遇到一个不方便的地方就是缺少语法高亮,或者看起来不合群,比如这样的:
读取这个值的地方倒是没什么问题,封装一个 get_table 函数就能解决:
于是想能不能底层提供点基础的支持呢?
想法1: 提供一个 t 函数序列化
这样的话,配置就能这样写:
想法2: 仅提供基础的关键函数(或者把所有lua函数都放开?估计能玩出花来, json 都不在话下了),让他人自己实现 t 函数:
想法3: 直接修改
_init_env,支持序列化 table :这样的话,配置就能这样写了:
PS: 我也不知道哪种想法比较合适,所以来问问大家有什么看法。虽然之前都是建议用其他工具生成配置,但是如果能提供基础支撑,其他工具会比较顺手一点。
Beta Was this translation helpful? Give feedback.
All reactions