golang 12-Factor应用配置加载与验证插件库configuro的使用
Golang 12-Factor应用配置加载与验证插件库configuro的使用
简介
Configuro是一个固执己见的配置加载和验证框架,它为容器化和12-Factor兼容的应用程序提供配置加载框架。
只需两行代码,无需额外设置,您就可以从配置文件加载配置,通过环境变量覆盖值,使用${ENV}表达式扩展值,并使用验证标签。
安装
go get github.com/sherifabdlnaby/configuro
import "github.com/sherifabdlnaby/configuro"
完整示例
package main
import (
"fmt"
"github.com/sherifabdlnaby/configuro"
)
// 1. 定义配置结构体
type Config struct {
Database struct {
Host string `validate:"required"`
Port int `validate:"required,min=1,max=65535"`
Username string
Password string
}
Logging struct {
Level string `validate:"oneof=debug info warn error"`
LineFormat string `config:"line_format"`
}
}
func main() {
// 2. 创建Configuro对象
config, err := configuro.NewConfig(
configuro.WithLoadFromEnvVars("APP"), // 使用APP_作为环境变量前缀
configuro.WithLoadDotEnv(".env"), // 加载.env文件
configuro.WithLoadFromConfigFile("config.yml", false), // 加载config.yml文件,如果文件不存在不报错
configuro.WithExpandEnvVars(), // 启用环境变量扩展
configuro.WithValidateByTags(), // 使用验证标签
configuro.WithValidateByFunc(true, true), // 使用验证函数,在第一个错误时停止,递归验证
)
if err != nil {
panic(err)
}
// 3. 创建配置结构体实例
cfg := &Config{}
// 4. 加载配置
err = config.Load(cfg)
if err != nil {
panic(err)
}
// 5. 验证配置
err = config.Validate(cfg)
if err != nil {
panic(err)
}
// 使用配置
fmt.Printf("Database Host: %s\n", cfg.Database.Host)
fmt.Printf("Logging Level: %s\n", cfg.Logging.Level)
}
配置加载流程
主要功能
1. 从环境变量加载配置
- 通过设置环境变量如
APP_DATABASE_HOST
来配置database.host
- 如果键名包含
_
,则在环境变量中用__
替代 - 可以通过JSON编码在环境变量中表达Map和List
- 可以通过
.env
文件加载未在操作系统中设置的环境变量
configuro.WithLoadFromEnvVars("APP") // 启用环境变量加载并设置前缀
configuro.WithLoadDotEnv(".env") // 启用加载.env文件
2. 从配置文件加载配置
- 默认加载
config.yml
文件 - 支持
.yml
,.yaml
,.json
, 和.toml
格式 - 可以通过环境变量覆盖配置文件路径
configuro.WithLoadFromConfigFile("config.yml", false) // 启用配置文件加载
configuro.WithEnvConfigPathOverload("CONFIG_DIR") // 允许通过环境变量覆盖配置文件路径
3. 环境变量扩展
- 支持
${ENV}
和${ENV|default}
表达式
示例配置文件:
database:
host: xyz:${PORT:3306}
username: admin
password: ${DB_PASSWORD}
configuro.WithExpandEnvVars() // 启用环境变量扩展
4. 配置验证
- 使用验证标签进行快速验证
- 实现
Validatable
接口进行自定义验证
type DatabaseConfig struct {
Host string `validate:"required"`
Port int `validate:"min=1,max=65535"`
}
// 实现Validatable接口
func (d *DatabaseConfig) Validate() error {
if d.Host == "localhost" {
return fmt.Errorf("localhost is not allowed")
}
return nil
}
验证选项:
configuro.WithValidateByTags() // 使用验证标签
configuro.WithValidateByFunc(true, true) // 使用验证函数,在第一个错误时停止,递归验证
注意事项
- 配置值的优先级为:
OS环境变量
>.env文件变量
>配置文件
>加载前结构体中设置的值
Configuro建立在以下优秀库之上:
- spf13/viper
- mitchellh/mapstructure
- go-playground/validator
- joho/godotenv
许可证
MIT License
Copyright © 2020 Sherif Abdel-Naby
欢迎贡献PR!
更多关于golang 12-Factor应用配置加载与验证插件库configuro的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang 12-Factor应用配置加载与验证插件库configuro的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 configuro 实现 Golang 12-Factor 应用配置管理
在构建符合 12-Factor 原则的应用时,配置管理是一个关键环节。configuro 是一个优秀的 Golang 配置加载与验证库,它完美支持 12-Factor 应用的配置需求。下面我将详细介绍如何使用 configuro。
12-Factor 配置原则
12-Factor 应用关于配置的核心原则:
- 将配置存储在环境变量中
- 严格区分代码和配置
- 配置应当易于在不同部署间修改
configuro 核心特性
- 支持从多种来源加载配置(环境变量、文件、命令行等)
- 支持配置验证
- 支持配置热重载
- 结构体标签绑定
- 支持嵌套配置
安装
go get github.com/sherifabdlnaby/configuro
基础使用示例
package main
import (
"fmt"
"log"
"github.com/sherifabdlnaby/configuro"
)
type Config struct {
Server struct {
Host string `config:"host" validate:"required,hostname"`
Port int `config:"port" validate:"required,min=1,max=65535"`
}
Database struct {
URL string `config:"url" validate:"required,url"`
Username string `config:"username" validate:"required"`
Password string `config:"password" validate:"required"`
}
}
func main() {
// 创建配置加载器
loader, err := configuro.NewConfig(
configuro.WithLoadFromConfigFile(".env", true),
configuro.WithLoadFromEnvVars("APP"),
)
if err != nil {
log.Fatal(err)
}
// 加载配置到结构体
var cfg Config
if err := loader.Load(&cfg); err != nil {
log.Fatal(err)
}
// 验证配置
if err := loader.Validate(&cfg); err != nil {
log.Fatal(err)
}
fmt.Printf("Server: %s:%d\n", cfg.Server.Host, cfg.Server.Port)
fmt.Printf("Database: %s@%s\n", cfg.Database.Username, cfg.Database.URL)
}
高级功能
1. 多配置源合并
loader, err := configuro.NewConfig(
configuro.WithLoadFromConfigFile("config.yaml", false),
configuro.WithLoadFromConfigFile(".env", true), // 覆盖前面的配置
configuro.WithLoadFromEnvVars("APP"), // 覆盖文件配置
)
2. 自定义验证器
loader, err := configuro.NewConfig(
configuro.WithCustomValidators(map[string]configuro.ValidatorFunc{
"strongpassword": func(fl validator.FieldLevel) bool {
password := fl.Field().String()
return len(password) >= 8 &&
strings.ContainsAny(password, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") &&
strings.ContainsAny(password, "abcdefghijklmnopqrstuvwxyz") &&
strings.ContainsAny(password, "0123456789")
},
}),
)
type AuthConfig struct {
Password string `validate:"required,strongpassword"`
}
3. 热重载配置
loader, err := configuro.NewConfig(
configuro.WithLoadFromConfigFile("config.yaml", false),
configuro.WithReloadOnConfigFileChange(true),
)
// 定期检查配置变化
go func() {
for {
time.Sleep(5 * time.Second)
if changed, _ := loader.HasConfigChanged(); changed {
var newCfg Config
if err := loader.Load(&newCfg); err == nil {
// 安全地更新配置
}
}
}
}()
最佳实践
-
环境区分:为不同环境使用不同的配置文件
env := os.Getenv("APP_ENV") if env == "" { env = "development" } configFile := fmt.Sprintf("config.%s.yaml", env)
-
默认值:在结构体中设置合理的默认值
type Config struct { Timeout int `config:"timeout" default:"30"` }
-
敏感信息:不要将敏感信息提交到代码仓库,使用环境变量注入
loader, err := configuro.NewConfig( configuro.WithLoadFromConfigFile("config.yaml", false), configuro.WithLoadFromEnvVars("APP"), // 优先使用环境变量 )
-
配置验证:为所有关键配置添加验证规则
type DBConfig struct { URL string `validate:"required,url"` PoolSize int `validate:"min=1,max=20"` }
configuro 提供了强大而灵活的配置管理能力,完全符合 12-Factor 应用的原则。通过合理使用,可以构建出配置清晰、易于维护的 Golang 应用。