logo
0
0
WeChat Login
refactor: 重构子包命名与目录结构

process/config

process/configcnb.cool/zishuo/process 的文件配置适配层。

它专门负责这几件事:

  • 从 JSON / YAML 文件加载进程配置
  • 将配置保存回文件
  • 监听配置文件变化并做防抖重载
  • 将配置应用到 process.Manager

如果魔尊只是想在代码里直接管理进程,用根包 process 即可;只有在“配置文件驱动 + 热重载”场景下,才需要引入本子包。

快速开始

package main import ( "log" process "cnb.cool/zishuo/process" processconfig "cnb.cool/zishuo/process/config" ) func main() { manager := process.NewManager() configManager, err := processconfig.NewManager( manager, "config/processes.yaml", processconfig.ApplyStrategyRestart, ) if err != nil { log.Fatal(err) } configManager.Start() defer configManager.Stop() }

配置文件示例

processes: - name: api command: ./bin/api args: - --port=8080 directory: /srv/myapp auto_start: true auto_restart: unexpected start_secs: 3 start_retries: 5 environment: APP_ENV: production LOG_LEVEL: info health_check: type: http http_url: http://127.0.0.1:8080/healthz interval: 10 timeout: 3 fail_threshold: 3 - name: worker command: ./bin/worker directory: /srv/myapp auto_start: true depends_on: - api

核心 API

1. 加载与保存

cfg, err := processconfig.Load("config/processes.yaml") if err != nil { return err } if err := cfg.ValidateForPlatform(runtime.GOOS); err != nil { return err } if err := processconfig.Save(cfg, "config/processes.yaml"); err != nil { return err }

2. 启动 watcher

watcher, err := processconfig.NewWatcher("config/processes.yaml", func(event *processconfig.ChangeEvent) { switch event.Type { case "reload": // 使用 event.Config case "error": // 处理 event.Error } }) if err != nil { return err } watcher.Start() defer watcher.Stop()

3. 配置管理策略

processconfig.NewManager(...) 支持三种 ApplyStrategy

  • ApplyStrategyRestart:配置变更后重启受影响的进程。适合大多数场景。
  • ApplyStrategyReload:仅热更新可在线变更的部分,例如健康检查配置。
  • ApplyStrategyManual:只监听和加载,不自动改动已有进程。

最佳实践

1. 先做平台校验

如果同一份配置会在 Linux / macOS / Windows 间流转,建议先显式执行:

if err := cfg.ValidateForPlatform(runtime.GOOS); err != nil { return err }

这样能提前暴露 UserResourceLimits 等平台能力边界,而不是等进程启动后才失败。

2. 生产环境优先使用绝对路径

  • directory 建议使用绝对路径
  • 配置文件路径也建议使用绝对路径
  • watcher 会解析 symlink 的真实路径,但部署层仍应尽量保持路径稳定

3. 热重载策略要与应用能力匹配

  • 应用本身不支持在线 reload 时,优先 ApplyStrategyRestart
  • 若希望使用 GracefulReload,应给进程配置 readiness 健康检查
  • 对写接口要求低延迟的控制面,建议由 HTTP 层异步触发配置应用

相关入口

  • 根包运行时能力:cnb.cool/zishuo/process
  • HTTP 控制适配器:cnb.cool/zishuo/process/control/httpapi
  • 热重载示例:examples/config_hot_reload