实时生效配置
本文档详细介绍如何配置 cfgeditor 实现配置文件的实时生效功能。通过智能的文件监控和自动重载机制,您可以在修改配置文件后实现无缝更新,无需重启任何服务。
cfgeditor_server 自动重载
Section titled “cfgeditor_server 自动重载”cfgeditor_server 内置了文件监控功能,能够实时监测配置文件目录的变化。一旦检测到配置文件被修改,服务器会自动重新加载配置数据,确保您始终看到最新的配置内容。
要启用自动重载功能,只需在启动命令中添加 watch 参数:
java -jar ../cfggen.jar -datadir ../example/config -gen server,watch=1watch=1:启用对-datadir指定目录的文件监控- 数字含义:
1表示文件变化后,如果在 1 秒内没有进一步的修改,则触发自动重载 - 灵活调整:您可以根据实际需求调整这个数值,例如
watch=5表示等待 5 秒后重载
典型使用场景
Section titled “典型使用场景”这个功能在以下情况下特别有用:
- 团队协作:当团队成员通过 SVN/Git 更新配置文件时
- 手动编辑:直接修改 Excel、.cfg 或 .json 源文件时
- 工具集成:其他工具自动生成或修改配置文件时
重要提示:启用此功能后,无需手动重启 cfgeditor_server。只需等待服务器自动完成重载(通常只需几秒钟),然后在 cfgeditor.exe 中按下 F5 键刷新界面,即可立即看到更新后的配置。
游戏服务器/客户端自动重载
Section titled “游戏服务器/客户端自动重载”通过 postrun 参数,您可以配置在配置文件变化后自动执行额外的脚本,实现配置数据向游戏服务器或客户端的自动部署。
在启动命令中添加 postrun 参数:
java -jar ../cfggen.jar -datadir ../example/config -gen server,watch=1,postrun=upload.batpostrun 脚本示例
Section titled “postrun 脚本示例”下面是一个完整的 upload.bat 脚本示例,展示了常见的使用模式:
@echo offecho [%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 脚本示例
Section titled “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')] 配置更新流程完成"脚本解析机制
Section titled “脚本解析机制”当配置文件发生变化时,cfgeditor_server 会:
- 解析脚本注释行:提取以特定前缀开头的注释行
- 对于
.bat文件:提取:: -gen开头的行 - 对于
.sh文件:提取# -gen开头的行
- 对于
- 直接生成数据:在当前的 Java 进程中直接使用已加载的数据生成目标格式,无需额外启动 Java 进程,效率更高
- 执行脚本:运行脚本文件中的命令
根据您的部署环境,可以在脚本中添加相应的部署命令:
- 本地部署:直接复制生成的文件到目标目录
- 远程部署:使用
scp、curl或其他工具将文件上传到远程服务器 - 触发重载:调用游戏服务器的配置重载接口
完整流程示例
Section titled “完整流程示例”假设您的游戏架构如下:
- 配置服务器:运行 cfgeditor_server
- 游戏服务器:运行游戏逻辑,需要加载配置数据
- 游戏客户端:需要对应的 Lua 配置数据
配置修改后的自动生效流程:
- 策划在 cfgeditor.exe 中修改配置并保存
- cfgeditor_server 检测到文件变化,自动重载配置
- 解析
upload.bat中的生成命令,生成 Java 数据和 Lua 数据 - 执行部署命令,将数据文件推送到游戏服务器和客户端
- 游戏服务器检测到新配置文件,自动重载
- 客户端使用快捷键重载新配置
- 零延迟验证:策划修改配置后,可以立即在游戏中验证效果,大幅提升工作效率
- 无需重启服务:游戏服务器和客户端都无需重启,实现真正的热更新
- 全流程自动化:从配置修改到部署生效的整个流程完全自动化,减少人工操作错误
- 高效资源利用:在已有的 Java 进程中直接生成数据,避免额外进程开销,提升性能
- 灵活可扩展:支持多种部署方式和通知机制,适应不同的技术栈和环境
配置示例:完整工作流
Section titled “配置示例:完整工作流”下面是一个实际项目中的配置示例,展示了如何设置完整的实时生效工作流:
1. 服务器启动命令
java -jar cfggen.jar -datadir ./game_config -gen server,watch=3,postrun=deploy.bat,port=34562. deploy.bat 脚本
@echo offset 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 示例@RestControllerpublic class ConfigController { @PostMapping("/admin/reload-config") public String reloadConfig() { // 重新加载配置文件 ConfigManager.reload(); return "配置重载成功"; }}最佳实践建议
Section titled “最佳实践建议”1. 监控间隔设置
Section titled “1. 监控间隔设置”- 开发环境:建议使用较小的间隔(如
watch=1),快速响应修改能
2. postrun 脚本设计
Section titled “2. postrun 脚本设计”- 分阶段执行:先生成数据,再执行部署
- 错误处理:添加错误检查和日志记录
- 回滚机制:考虑配置错误时的回滚方案
3. 安全考虑
Section titled “3. 安全考虑”- 权限控制:确保脚本执行有适当的权限
- 网络安全:远程部署时使用安全的传输协议
- 备份策略:重要配置修改前自动备份
4. 监控与日志
Section titled “4. 监控与日志”- 启用日志:记录配置重载和脚本执行情况
- 监控告警:设置监控,当配置重载失败时及时告警
Q: watch 参数设置为 0 会怎样?
A: watch=0 表示禁用文件监控功能,需要手动重启服务器才能加载新配置。
Q: postrun 脚本执行失败怎么办? A: 检查脚本权限、路径是否正确,查看服务器日志获取详细错误信息。
Q: 如何调试 postrun 脚本? A: 可以先手动执行脚本,确保能正常运行,再配置到服务器中。
Q: 多个环境如何配置不同的 postrun 脚本? A: 可以为不同环境创建不同的脚本文件,通过环境变量或配置文件指定使用的脚本。