предисловие
В процессе нашей разработки фиксированная информация, такая как информация базы данных, конфигурация электронной почты и другие ключи сторонних служб, будет записана в файлы конфигурации, а файлы конфигурации имеют различные формы и форматы, включая JSON, TOML, YAML. Различные форматы и файлы конфигурации используется в тестовой среде, среда разработки и производственная среда не совпадают, давайте поговорим о Viper, который используется для загрузки информации о конфигурации в Go.
Что такое Вайпер?
Viper — это комплексное решение для настройки приложений Go, включая приложение 12-Factor. Он предназначен для работы в приложениях и может обрабатывать все типы потребностей в конфигурации и форматы. Он поддерживает:
- установить значение по умолчанию
- Чтение из файлов конфигурации свойств JSON, TOML, YAML, HCL и Java.
- Просмотр и повторное чтение файлов конфигурации в режиме реального времени (необязательно)
- читать из переменной окружения
- Чтение из системы удаленной настройки (etcd или Consul) и отслеживание изменений
- чтение из флагов командной строки
- читать из буфера
- установить явное значение
Viper можно рассматривать как реестр для всех потребностей конфигурации приложений.
Зачем использовать Вайпер
При создании современных приложений вам не нужно беспокоиться о форматах файлов конфигурации, вы можете сосредоточиться на создании отличного программного обеспечения. Viper может делать следующее:
- Загружать и анализировать файлы конфигурации в формате свойств JSON, TOML, YAML, HCL или Java.
- Значения по умолчанию могут быть установлены для различных элементов конфигурации
- Элементы конфигурации можно указать в командной строке, чтобы переопределить значения конфигурации.
- Предоставляет систему псевдонимов, которая позволяет переименовывать параметры без нарушения существующего кода.
- Легко определить разницу между предоставленными пользователем аргументами командной строки или файлами конфигурации, которые совпадают с параметрами по умолчанию.
Порядок приоритета чтения информации о конфигурации Viper, от высокого к низкому, следующий:
- Явно вызвать функцию Set
- аргументы командной строки
- переменная среды
- конфигурационный файл
- система хранения ключей/значений
- По умолчанию
- Ключи элементов конфигурации Viper не чувствительны к регистру.
Если вы используете вайпер
Установите с помощью go get -u github.com/spf13/viper
const (
// gRPC 服务地址
Address = "0.0.0.0:9090"
)
......
Адрес вроде выше прописан в коде, можем закинуть в конфигурационный файл для чтения, после установки viper используем viper для записи файла формата toml
func init(){
viper.SetConfigFile("hello.toml")//文件名
viper.Set("Address","0.0.0.0:9090")//统一把Key处理成小写 Address->address
err := viper.WriteConfig()//写入文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
}
Запустите его, вы обнаружите, что файл hello.toml появится в текущем каталоге✅
Чтение файлов конфигурации гораздо более распространено в коде, чем запись файлов конфигурации.
viper.SetConfigFile("hello.toml")
err := viper.ReadInConfig() // 会查找和读取配置文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
Address = viper.GetString("Address")
//key取Address或者address都能取到值,反正viper转成小写处理
fmt.Println(Address)
Другое использование
установить значение по умолчанию
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
Отслеживание изменений конфигурации
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置发生变更:", e.Name)
})
Чтение удаленного ключа/значения
Чтобы включить эту функцию, вам необходимо импортировать пакет viper/remot:
import _ "github.com/spf13/viper/remote"
viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hello.json")
viper.SetConfigType("json") // 因为不知道格式,所以需要指定
err := viper.ReadRemoteConfig()
разное
Ниже приведен скриншот всего кода
Суммировать
Код вайпера короткий и лаконичный, всего три файла, что очень удобно для чтения новичкам, при необходимости исходный код будет прочитан в дальнейшем.