golang 12-Factor应用配置加载与验证插件库configuro的使用

Golang 12-Factor应用配置加载与验证插件库configuro的使用

Configuro Logo

简介

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

1 回复

更多关于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 应用关于配置的核心原则:

  1. 将配置存储在环境变量中
  2. 严格区分代码和配置
  3. 配置应当易于在不同部署间修改

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 {
				// 安全地更新配置
			}
		}
	}
}()

最佳实践

  1. 环境区分:为不同环境使用不同的配置文件

    env := os.Getenv("APP_ENV")
    if env == "" {
        env = "development"
    }
    configFile := fmt.Sprintf("config.%s.yaml", env)
    
  2. 默认值:在结构体中设置合理的默认值

    type Config struct {
        Timeout int `config:"timeout" default:"30"`
    }
    
  3. 敏感信息:不要将敏感信息提交到代码仓库,使用环境变量注入

    loader, err := configuro.NewConfig(
        configuro.WithLoadFromConfigFile("config.yaml", false),
        configuro.WithLoadFromEnvVars("APP"), // 优先使用环境变量
    )
    
  4. 配置验证:为所有关键配置添加验证规则

    type DBConfig struct {
        URL string `validate:"required,url"`
        PoolSize int `validate:"min=1,max=20"`
    }
    

configuro 提供了强大而灵活的配置管理能力,完全符合 12-Factor 应用的原则。通过合理使用,可以构建出配置清晰、易于维护的 Golang 应用。

回到顶部