安全热更新配置
Zero 可以在进程运行期间应用完整配置,包括监听器、协议凭证、路由、出站、策略组、事件 sink 和部分应用服务。更新采用“校验、重建、确认、失败回滚”的事务路径。
CLI 流程
准备完整候选文件 candidate.json:
zero validate candidate.json
zero reload candidate.json
zero status --jsonreload 会读取候选文件并通过本地 IPC 执行 config.apply。成功时输出:
config applied这表示 Zero 已等待 listener 和相关应用服务完成 reconciliation,不只是接受了请求。
HTTP/gRPC 流程
控制端使用同一个完整配置依次调用:
config.validateconfig.apply- 查询
/api/v1/runtime、/api/v1/policies和/api/v1/sinks
config.apply 会持久化到运行实例的源配置文件。只需要临时运行覆盖时使用 config.apply_runtime;进程重启后仍以源配置为准。
哪些变更可以在线应用
- 新增、删除或修改 inbound;
- listener 地址、端口、协议形状变化;
- 协议凭证列表变化;
- outbound、路由、mode 和策略组变化;
- DNS 与通用运行参数;
- FlowHook;
- Connector/JSONL sink、outbox 和 dispatcher 策略。
同 tag listener 的形状变化会重启该 listener。只改变协议认证条目时,支持该能力的协议会走自己的热更新路径。
不能在线自替换的内容
api.control 的监听地址、API key 来源和 gRPC 安全配置不能通过承载该命令的控制面自替换。否则响应通道和权限可能在事务中途消失。
修改这些字段时:
- 生成并校验新配置;
- 保留旧配置和二进制;
- 由 systemd、Windows 服务管理器或部署平台重启;
- 从新控制端点检查健康;
- 失败时恢复旧配置并重新启动。
程序二进制升级也不属于 config.apply,由部署系统负责。
失败时会发生什么
如果新 listener 无法绑定,或 EventDispatcher、FlowHook 等应用服务重建失败,Zero 会尝试恢复上一份运行配置和对应服务。错误响应会说明应用失败以及回滚是否成功。
常见失败原因:
- 新端口已被其他进程占用;
- 配置引用了未编译的协议;
- 证书、规则文件或状态目录不可读写;
- Connector 配置存在,但二进制没有
event-dispatcher/connector; - 候选配置试图修改
api.control。
失败后不要只重试同一请求。先确认旧 listener、策略和 sink 状态仍然正常,再修正候选配置。
多个写入者
config.apply 接收整份配置。当前外部合同没有 revision/CAS 字段,因此一个旧副本可能在业务层覆盖另一个控制端的更新。
生产部署应保证一个节点只有一个配置写入所有者。其他系统通过该所有者提交变更,或只执行不会替换整份配置的通用命令。