使用fsnotify监听配置文件变化,2. 定义Config结构体并实现reloadConfig函数重新加载,3. 用sync.RWMutex保护配置读写,4. 在goroutine中监听事件并触发重载,实现不重启更新配置。

在Golang初级项目中实现配置热更新,核心是让程序在不重启的情况下感知配置文件的变化并自动加载新配置。这在开发调试或线上微调参数时非常实用。实现方式不需要复杂框架,使用标准库和少量第三方工具即可完成。
监听配置文件变化
使用 fsnotify 库可以监听文件系统事件,比如配置文件的修改。这是实现热更新的基础。
安装 fsnotify:
go get gopkg.in/fsnotify/fsnotify.v1示例代码:
立即学习“go语言免费学习笔记(深入)”;
创建一个监听器,监控 config.json 文件的写入或保存事件:
watcher, _ := fsnotify.NewWatcher()defer watcher.Close()
watcher.Add("config.json")
通过 watcher.Events 通道接收文件变更通知,一旦捕获到写入事件,就重新读取配置。
动态加载配置结构
定义一个结构体来映射配置内容,比如:
type Config struct {Port int `json:"port"`
LogLevel string `json:"log_level"`
}
var Cfg Config
每次文件变化时,调用一个 reloadConfig 函数重新解析文件:
func reloadConfig() error {data, err := os.ReadFile("config.json")
if err != nil { return err }
return json.Unmarshal(data, &Cfg)
}
首次启动时调用一次,后续在监听到变更时再次调用。
避免并发读写冲突
配置被多个 goroutine 使用时,直接修改结构体可能引发竞态。使用 sync.RWMutex 保护读写操作。
示例:
var configMutex sync.RWMutexfunc GetConfig() Config {
configMutex.RLock()
defer configMutex.RUnlock()
return Cfg
}
// reload 时写锁
configMutex.Lock()
reloadConfig()
configMutex.Unlock()
这样能保证配置读取安全,避免热更新过程中出现数据不一致。
整合到主流程
在 main 函数中启动一个 goroutine 专门监听文件变化:
go func() {for event := range watcher.Events {
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("配置文件已更新,重新加载")
reloadConfig()
}
}
}()
主程序继续运行 HTTP 服务或其他逻辑,配置变更后自动生效。
基本上就这些。不需要引入完整配置中心,也能在小项目中实现稳定可靠的热更新能力。关键是监听 + 安全重载,结构清晰,维护简单。










