process/config 是 cnb.cool/zishuo/process 的文件配置适配层。
它专门负责这几件事:
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
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
}
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()
processconfig.NewManager(...) 支持三种 ApplyStrategy:
ApplyStrategyRestart:配置变更后重启受影响的进程。适合大多数场景。ApplyStrategyReload:仅热更新可在线变更的部分,例如健康检查配置。ApplyStrategyManual:只监听和加载,不自动改动已有进程。如果同一份配置会在 Linux / macOS / Windows 间流转,建议先显式执行:
if err := cfg.ValidateForPlatform(runtime.GOOS); err != nil {
return err
}
这样能提前暴露 User、ResourceLimits 等平台能力边界,而不是等进程启动后才失败。
directory 建议使用绝对路径ApplyStrategyRestartGracefulReload,应给进程配置 readiness 健康检查cnb.cool/zishuo/processcnb.cool/zishuo/process/control/httpapiexamples/config_hot_reload