feat(lua-client): 新增 Lua 客户端 SDK 及示例
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env lua
|
||||
|
||||
-- 添加客户端库路径
|
||||
local script_dir = debug.getinfo(1, "S").source:match("@(.+)/[^/]+$") or "."
|
||||
package.path = package.path .. ";" .. script_dir .. "/../kenaito-conf-lua-client/?.lua"
|
||||
|
||||
local kenaito = require("kenaito_conf")
|
||||
|
||||
-- 读取环境变量
|
||||
local function get_env(key, default)
|
||||
local value = os.getenv(key)
|
||||
if value and value ~= "" then
|
||||
return value
|
||||
end
|
||||
return default
|
||||
end
|
||||
|
||||
-- 配置值(可被远程配置覆盖)
|
||||
local config_values = {
|
||||
["database.host"] = get_env("DATABASE_HOST", "192.168.1.1"),
|
||||
["database.port"] = get_env("DATABASE_PORT", "8888"),
|
||||
["database.name"] = get_env("DATABASE_NAME", "xxxx"),
|
||||
["database.user"] = get_env("DATABASE_USER", "xxxx"),
|
||||
["database.password"] = get_env("DATABASE_PASSWORD", "xxxxxxxx"),
|
||||
}
|
||||
|
||||
-- 创建配置
|
||||
local config = kenaito.Config.new({
|
||||
base_url = get_env("KENAITO_BASE_URL", "http://localhost:8080"),
|
||||
app_name = get_env("KENAITO_APP_NAME", "kenaito-springboot-demo"),
|
||||
env = get_env("KENAITO_ENV", "daily"),
|
||||
version = get_env("KENAITO_VERSION", "latest"),
|
||||
token = get_env("KENAITO_TOKEN", ""),
|
||||
sync_interval = tonumber(get_env("KENAITO_SYNC_INTERVAL", "10")),
|
||||
cache_dir = get_env("KENAITO_CACHE_DIR", "."),
|
||||
})
|
||||
|
||||
-- 创建客户端
|
||||
local client = kenaito.Client.new({ config = config })
|
||||
|
||||
-- 监听配置变更
|
||||
client:on_change(function(changed)
|
||||
print("Config changed:")
|
||||
for k, v in pairs(changed) do
|
||||
print(" " .. k .. " = " .. v)
|
||||
if config_values[k] then
|
||||
config_values[k] = v
|
||||
print(" [updated] " .. k .. " = " .. v)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- 启动客户端
|
||||
local ok, err = pcall(function()
|
||||
client:start()
|
||||
end)
|
||||
|
||||
if not ok then
|
||||
print("Failed to init config client, using local defaults: " .. tostring(err))
|
||||
end
|
||||
|
||||
-- 应用远程配置
|
||||
local remote = client:get_all()
|
||||
local count = 0
|
||||
for _ in pairs(remote) do
|
||||
count = count + 1
|
||||
end
|
||||
|
||||
for k, v in pairs(remote) do
|
||||
if config_values[k] then
|
||||
config_values[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
print("loaded " .. count .. " configs from remote")
|
||||
print()
|
||||
|
||||
-- 显示当前配置
|
||||
print("Current configs:")
|
||||
local keys = {}
|
||||
for k in pairs(config_values) do
|
||||
table.insert(keys, k)
|
||||
end
|
||||
table.sort(keys)
|
||||
for _, k in ipairs(keys) do
|
||||
print(" " .. k .. " = " .. config_values[k])
|
||||
end
|
||||
|
||||
print()
|
||||
print("Listening for config changes... (press Ctrl+C to stop)")
|
||||
|
||||
-- 同步循环
|
||||
local running = true
|
||||
|
||||
-- 注册信号处理(如果支持)
|
||||
if package.loaded["posix.signal"] then
|
||||
local signal = require("posix.signal")
|
||||
signal.signal(signal.SIGINT, function()
|
||||
print("\nShutting down...")
|
||||
running = false
|
||||
client:stop()
|
||||
end)
|
||||
end
|
||||
|
||||
-- 主循环
|
||||
while running do
|
||||
client:sync_once()
|
||||
|
||||
-- 等待 sync_interval 秒,期间检查是否应该停止
|
||||
for i = 1, config.sync_interval * 10 do
|
||||
if not running then
|
||||
break
|
||||
end
|
||||
-- 休眠 0.1 秒
|
||||
local start = os.clock()
|
||||
while os.clock() - start < 0.1 do
|
||||
-- busy wait
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user