基于 Viper 和 Gin 的配置管理系统,支持热更新和自动重启服务器。
- ✅ 配置文件解析: 使用 Viper 解析 YAML 配置文件
- ✅ 热更新: 配置文件变化时自动重新加载
- ✅ 自动重启: 配置变化后自动重启 Gin 服务器
- ✅ 线程安全: 支持并发安全的配置访问
- ✅ 类型安全: 使用结构体映射,避免字符串键值访问
- ✅ 优雅关闭: 支持优雅关闭服务器
- ✅ 全局访问: 在任何文件中都可以方便地访问配置
.
├── config/
│ ├── types.go # 配置结构体定义
│ └── config.go # 配置管理器
├── server/
│ └── server.go # 服务器管理
├── handlers/
│ └── example.go # 示例处理器
├── config.yaml # 配置文件
├── main.go # 主程序
└── README.md # 说明文档
system:
name: "QuickStart-React"
port: 3000
host: "0.0.0.0"go mod tidygo run main.go修改 config.yaml 文件中的端口号或应用名称,保存后观察控制台输出,服务器会自动重启。
启动后可以访问以下接口:
GET /health- 健康检查GET /config- 获取当前配置GET /api/info- 获取应用信息
package yourpackage
import "quickstart-react/config"
func someFunction() {
cfg := config.GetConfig()
// 使用配置
appName := cfg.System.Name
port := cfg.System.Port
host := cfg.System.Host
}func yourHandler(c *gin.Context) {
cfg := config.GetConfig()
c.JSON(200, gin.H{
"app_name": cfg.System.Name,
"port": cfg.System.Port,
})
}import "quickstart-go-react/config"
// 获取字符串值
appName := config.GetString("system.name")
// 获取整数值
port := config.GetInt("system.port")在 config.yaml 中添加新配置:
system:
name: "QuickStart-React"
port: 3000
host: "0.0.0.0"
database:
host: "localhost"
port: 5432
name: "mydb"
user: "admin"
password: "password"在 config/types.go 中添加对应的结构体:
type Config struct {
System SystemConfig `yaml:"system"`
Database DatabaseConfig `yaml:"database"`
}
type DatabaseConfig struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
Name string `yaml:"name"`
User string `yaml:"user"`
Password string `yaml:"password"`
}cfg := config.GetConfig()
dbHost := cfg.Database.Host
dbPort := cfg.Database.Port你可以注册回调函数来监听配置变化:
config.OnConfigChange(func(cfg *config.Config) {
log.Printf("配置已更新: %+v", cfg)
// 执行你的自定义逻辑
})- 配置文件路径: 程序会在当前目录和
./config目录下查找config.yaml文件 - 端口占用: 修改端口后,旧端口会在服务器重启时自动释放
- 并发安全:
GetConfig()方法是线程安全的,可以在多个 goroutine 中安全使用 - 配置副本:
GetConfig()返回配置的副本,外部修改不会影响原始配置
A: 在 config/config.go 的 Init() 函数中添加:
viper.AutomaticEnv()
viper.SetEnvPrefix("APP") // 环境变量前缀A: Viper 支持多种格式,只需修改 SetConfigType() 即可:
viper.SetConfigType("json") // 或 "toml", "properties" 等A: 注释掉 Init() 函数中的 viper.WatchConfig() 相关代码即可。
- 配置读取使用读写锁,读操作性能优异
- 配置变化时会创建新的配置副本,内存使用合理
- 服务器重启过程中会有短暂的服务中断(通常小于1秒)
MIT License