Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。
安装依赖
go get github.com/spf13/viper
go get github.com/spf13/viper/remote
go get go.etcd.io/etcd/client/v3
"github.com/spf13/viper/remote"
要写在etcd客户端import里
1. 配置格式—就是可以读的配置类型
Viper 支持多种常见的配置格式,包括:
- JSON: 一种轻量级的数据交换格式,易于阅读和编写。
- YAML: 一种人类可读的数据序列化格式,常用于配置文件。
- TOML: 一种易于阅读的配置文件格式,旨在成为最小的配置文件格式。
- HCL: HashiCorp 配置语言,用于描述基础设施配置。
- Java Properties: 一种简单的键值对格式,常用于 Java 应用程序。
- INI: 一种简单的配置文件格式,常用于 Windows 应用程序。
- Envfile: 环境变量文件格式,通常用于存储环境变量。
2. 支持的数据源—可以从哪里导入要读的配置
Viper 不仅支持从文件中读取配置,还支持从多种数据源获取配置,包括:
- 文件: 从本地文件系统中读取配置文件。
- 环境变量: 从操作系统的环境变量中读取配置。
- io.Reader: 从Reader中读取配置。
- 远程配置系统: 从远程配置系统(如 etcd、Consul)中读取配置。
Viper 支持的四种常见数据源的简单实现:
1. 文件
Viper 支持从多种文件格式中读取配置,包括 JSON、YAML、TOML、HCL、INI 等。
使用方法
- 设置配置文件路径和名称:
viper.SetConfigName("config") // 配置文件名称(不带扩展名) viper.SetConfigType("yaml") // 配置文件类型(如 yaml、json 等) viper.AddConfigPath(".") // 配置文件搜索路径
- 读取配置文件:
if err := viper.ReadInConfig(); err != nil { log.Fatalf("Error reading config file: %s", err) }
示例
假设有一个 config.yaml
文件:
database:
host: localhost
port: 5432
读取配置:
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err != nil {
log.Fatal(err)
}
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))
2. 环境变量
Viper 可以从操作系统的环境变量中读取配置,适合在容器化或云原生环境中使用。
使用方法
- 启用环境变量支持:
viper.AutomaticEnv() // 自动绑定环境变量
- 设置环境变量前缀(可选):
viper.SetEnvPrefix("MYAPP") // 环境变量前缀(如 MYAPP_DATABASE_HOST)
- 绑定特定键到环境变量:
viper.BindEnv("database.host", "DB_HOST") // 将 database.host 绑定到环境变量 DB_HOST
示例
假设设置了环境变量:
export DB_HOST=localhost
export DB_PORT=5432
读取配置:
viper.AutomaticEnv()
viper.BindEnv("database.host", "DB_HOST")
viper.BindEnv("database.port", "DB_PORT")
fmt.Println("Database Host:", viper.GetString("database.host"))
fmt.Println("Database Port:", viper.GetInt("database.port"))
3. io.Reader
Viper 支持从实现了 io.Reader
接口的对象中读取配置,适合从内存或网络流中加载配置。
使用方法
- 从
io.Reader
读取配置:configData := []byte(`{"database": {"host": "localhost", "port": 5432}}`) reader := bytes.NewReader(configData) viper.SetConfigType("json") // 设置配置类型 if err := viper.ReadConfig(reader); err != nil { log.Fatal(err) }
示例
configData := []byte(`
database:
host: localhost
port: 5432
`)
reader := bytes.NewReader(configData)
viper.SetConfigType("yaml")
if err := viper.Read