[Короткие и мощные колеса] Viper (1)

Go
[Короткие и мощные колеса] Viper (1)

предисловие


В процессе нашей разработки фиксированная информация, такая как информация базы данных, конфигурация электронной почты и другие ключи сторонних служб, будет записана в файлы конфигурации, а файлы конфигурации имеют различные формы и форматы, включая 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()

разное


Ниже приведен скриншот всего кода

Суммировать


Код вайпера короткий и лаконичный, всего три файла, что очень удобно для чтения новичкам, при необходимости исходный код будет прочитан в дальнейшем.