⚡ 实时生效配置
本文档详细介绍如何配置 cfgeditor 实现配置文件的实时生效功能。通过智能的文件监控和自动重载机制,您可以在修改配置文件后实现无缝更新,无需重启任何服务。
🔄 cfgeditor_server 自动重载
功能概述
cfgeditor_server 内置了文件监控功能,能够实时监测配置文件目录的变化。一旦检测到配置文件被修改,服务器会自动重新加载配置数据,确保您始终看到最新的配置内容。
启用方法
要启用自动重载功能,只需在启动命令中添加 watch 参数:
java -jar ../cfggen.jar -datadir ../example/config -gen server,watch=1
参数详解
watch=1:启用对-datadir指定目录的文件监控- 数字含义:
1表示文件变化后,如果在 1 秒内没有进一步的修改,则触发自动重载 - 灵活调整:您可以根据实际需求调整这个数值,例如
watch=5表示等待 5 秒后重载
典型使用场景
这个功能在以下情况下特别有用:
- 团队协作:当团队成员通过 SVN/Git 更新配置文件时
- 手动编辑:直接修改 Excel、.cfg 或 .json 源文件时
- 工具集成:其他工具自动生成或修改配置文件时
重要提示:启用此功能后,无需手动重启 cfgeditor_server。只需等待服务器自动完成重载(通常只需几秒钟),然后在 cfgeditor.exe 中按下 F5 键刷新界面,即可立即看到更新后的配置。
🎮 游戏服务器/客户端自动重载
功能概述
通过 postrun 参数,您可以配置在配置文件变化后自动执行额外的脚本,实现配置数据向游戏服务器或客户端的自动部署。
启用方法
在启动命令中添加 postrun 参数:
java -jar ../cfggen.jar -datadir ../example/config -gen server,watch=1,postrun=upload.bat
postrun 脚本示例
下面是一个完整的 upload.bat 脚本示例,展示了常见的使用模式:
@echo off
echo [%date% %time%] 开始处理配置更新...
:: 生成 Java 数据文件(供游戏服务器使用)
:: -gen javadata
:: 生成 Lua 数据文件(供游戏客户端使用)
:: -gen lua,dir:../Unity/Lua,own:client,emmylua:true,sharedEmptyTable:true,shared
:: 可选:生成其他格式的数据
:: -gen json,dir:../config/json
echo 数据生成完成,开始部署...
:: 示例1:本地部署 - 复制文件到游戏服务器目录
xcopy /Y config.data "D:\GameServer\config\config.data"
xcopy /Y ..\Unity\Lua\*.lua "D:\GameServer\lua\"
:: 示例2:远程部署 - 使用 scp 上传到 Linux 服务器
:: scp config.data user@gameserver:/opt/game/config/
:: 示例3:调用 API 触发游戏服务器重载配置
:: curl -X POST http://192.168.1.100:8080/api/config/reload
:: 示例4:发送通知(如 Slack、钉钉等)
:: curl -X POST https://hooks.slack.com/services/xxx -d '{"text":"配置已更新"}'
echo [%date% %time%] 配置更新流程完成
Linux Shell 脚本示例
如果您在 Linux 环境下运行,可以使用 .sh 脚本:
#!/bin/bash
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始处理配置更新..."
# 生成 Java 数据文件(供游戏服务器使用)
# -gen javadata
# 生成 Lua 数据文件(供游戏客户端使用)
# -gen lua,dir:../Unity/Lua,own:client,emmylua:true,sharedEmptyTable:true,shared
echo "数据生成完成,开始部署..."
# 示例1:本地部署
cp -f config.data /opt/gameserver/config/
cp -f ../Unity/Lua/*.lua /opt/gameserver/lua/
# 示例2:远程部署到其他服务器
# scp config.data user@remote-server:/opt/game/config/
# 示例3:重启游戏服务器进程(谨慎使用)
# systemctl restart game-server
# 示例4:发送通知
# curl -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d "chat_id=<CHAT_ID>&text=配置已更新"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 配置更新流程完成"
脚本解析机制
当配置文件发生变化时,cfgeditor_server 会:
- 解析脚本注释行:提取以特定前缀开头的注释行
- 对于
.bat文件:提取:: -gen开头的行 - 对于
.sh文件:提取# -gen开头的行
- 对于
- 直接生成数据:在当前的 Java 进程中直接使用已加载的数据生成目标格式,无需额外启动 Java 进程,效率更高
- 执行脚本:运行脚本文件中的命令
部署方式
根据您的部署环境,可以在脚本中添加相应的部署命令:
- 本地部署:直接复制生成的文件到目标目录
- 远程部署:使用
scp、curl或其他工具将文件上传到远程服务器 - 触发重载:调用游戏服务器的配置重载接口
完整流程示例
假设您的游戏架构如下:
- 配置服务器:运行 cfgeditor_server
- 游戏服务器:运行游戏逻辑,需要加载配置数据
- 游戏客户端:需要对应的 Lua 配置数据
配置修改后的自动生效流程:
- 策划在 cfgeditor.exe 中修改配置并保存
- cfgeditor_server 检测到文件变化,自动重载配置
- 解析
upload.bat中的生成命令,生成 Java 数据和 Lua 数据 - 执行部署命令,将数据文件推送到游戏服务器和客户端
- 游戏服务器检测到新配置文件,自动重载
- 客户端使用快捷键重载新配置
优势
- 零延迟验证:策划修改配置后,可以立即在游戏中验证效果,大幅提升工作效率
- 无需重启服务:游戏服务器和客户端都无需重启,实现真正的热更新
- 全流程自动化:从配置修改到部署生效的整个流程完全自动化,减少人工操作错误
- 高效资源利用:在已有的 Java 进程中直接生成数据,避免额外进程开销,提升性能
- 灵活可扩展:支持多种部署方式和通知机制,适应不同的技术栈和环境
配置示例:完整工作流
下面是一个实际项目中的配置示例,展示了如何设置完整的实时生效工作流:
1. 服务器启动命令
java -jar cfggen.jar -datadir ./game_config -gen server,watch=3,postrun=deploy.bat,port=3456
2. deploy.bat 脚本
@echo off
set LOG_FILE=deploy.log
echo [%date% %time%] === 开始配置部署 === >> %LOG_FILE%
:: 生成服务器数据
:: -gen javadata,dir:./server_data
:: 生成客户端数据
:: -gen lua,dir:./client_lua,own:client
:: 1. 备份当前配置
xcopy /Y ./server_data\config.data ./backup\config_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.data
:: 2. 部署到测试服务器
echo 部署到测试服务器... >> %LOG_FILE%
xcopy /Y ./server_data\config.data "\\test-server\share\config\" >> %LOG_FILE%
xcopy /Y ./client_lua\*.lua "\\test-server\share\lua\" >> %LOG_FILE%
:: 3. 触发测试服务器重载
curl -X POST http://test-server:8080/admin/reload-config --connect-timeout 10 >> %LOG_FILE%
:: 4. 发送通知
curl -X POST https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx ^
-H "Content-Type: application/json" ^
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"游戏配置已更新,测试环境已生效\"}}" >> %LOG_FILE%
echo [%date% %time%] === 配置部署完成 === >> %LOG_FILE%
echo. >> %LOG_FILE%
3. 游戏服务器的配置监听 游戏服务器需要实现一个简单的 HTTP 接口来接收重载命令:
// Java 示例
@RestController
public class ConfigController {
@PostMapping("/admin/reload-config")
public String reloadConfig() {
// 重新加载配置文件
ConfigManager.reload();
return "配置重载成功";
}
}
💡 最佳实践建议
1. 监控间隔设置
- 开发环境:建议使用较小的间隔(如
watch=1),快速响应修改能
2. postrun 脚本设计
- 分阶段执行:先生成数据,再执行部署
- 错误处理:添加错误检查和日志记录
- 回滚机制:考虑配置错误时的回滚方案
3. 安全考虑
- 权限控制:确保脚本执行有适当的权限
- 网络安全:远程部署时使用安全的传输协议
- 备份策略:重要配置修改前自动备份
4. 监控与日志
- 启用日志:记录配置重载和脚本执行情况
- 监控告警:设置监控,当配置重载失败时及时告警
🆘 常见问题
Q: watch 参数设置为 0 会怎样? A: watch=0 表示禁用文件监控功能,需要手动重启服务器才能加载新配置。
Q: postrun 脚本执行失败怎么办? A: 检查脚本权限、路径是否正确,查看服务器日志获取详细错误信息。
Q: 如何调试 postrun 脚本? A: 可以先手动执行脚本,确保能正常运行,再配置到服务器中。
Q: 多个环境如何配置不同的 postrun 脚本? A: 可以为不同环境创建不同的脚本文件,通过环境变量或配置文件指定使用的脚本。