Как мы определяем и загружаем конфигурацию из файлов.


Справочная информация

Когда мы пишем приложения, мы в основном используем файлы конфигурации, от различных shell до nginx и т.д., все они имеют свои собственные файлы конфигурации. Хотя это не слишком сложно, элементы конфигурации относительно громоздки, и их разбор и проверка могут быть хлопотными. В этой статье я расскажу, как упростить определение и разбор конфигурационных файлов.

Сценарий

Если мы хотим написать сервис Restful API, элементы конфигурации, вероятно, будут иметь следующее содержание.

Ранее мы использовали json для конфигурационного файла, но с json была проблема в том, что мы не могли добавлять комментарии, поэтому мы перешли на формат yaml.

Теперь давайте посмотрим, как легко определить и разобрать такой конфигурационный файл с помощью go-zero ~

Определение конфигурации

Сначала нам нужно определить вышеуказанные требования к конфигурации в структуре Go следующим образом.

RestfulConf struct {
    Host string `json:",default=0.0.0.0"`
    Port int `json:",range=[80,65535)"`
    LogMode string `json:",options=[file,console]"`
    Verbose bool `json:",optional"`
    MaxConns int `json:",default=10000"`
    Timeout time.Duration `json:",default=3s"`
    CpuThreshold int64 `json:",default=900,range=[0:1000]"`
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Как видите, у нас есть определенные определения и ограничения для каждого элемента конфигурации, некоторые из которых определены следующим образом.

Кроме того, некоторые атрибуты могут использоваться вместе, например.

Файлы конфигурации

Поскольку мы задаем много значений по умолчанию при определении конфигурации, а также используем optional для указания опциональности, поэтому наш файл конфигурации имеет относительно немного элементов конфигурации, которые могут использовать значения по умолчанию без явного указания, как показано ниже.

# Because many of them have default values, you only need to write the ones
# that need to be specified and the ones that don't have default values
Port: 8080
LogMode: console
# You can read the values of environment variables
MaxBytes: ${MAX_BYTES}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот примечание, если значение символов конфигурации — все числа, и вы определяете тип конфигурации как строка, например, некоторые люди часто используют 123456 для проверки пароля, но пароль обычно определяется как строка, конфигурация должна быть записана следующим образом (просто пример, пароли обычно не рекомендуется записывать в конфигурационный файл)

Password: "123456"
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь нельзя пропускать двойные кавычки, иначе будет сообщено о type mismatch, так как парсер yaml разберет 123456 как int.

Загрузка конфигурационных файлов

У нас есть определение конфигурации (config.go) и файл конфигурации (config.yaml), следующий шаг — загрузить файл конфигурации, что можно сделать тремя способами.

  • должен быть успешно загружен, иначе программа выйдет, мы обычно используем так, если конфигурация не верна, программа не сможет продолжить работу
// If error, exit the program directly
var config RestfulConf
conf.MustLoad("config.yaml", &config)
Войти в полноэкранный режим Выйти из полноэкранного режима

Код по умолчанию, сгенерированный инструментом go-zero goctl, также использует MustLoad для загрузки конфигурационного файла

  • Загрузите конфигурацию и обработайте error самостоятельно
// handle errors on your own
var config RestfulConf
// For simplicity, LoadConfig will be changed to Load later,
// LoadConfig has been marked as Deprecated.
if err := conf.LoadConfig("config.yaml", &config); err ! = nil {
    log.Fatal(err)
}
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Загрузите конфигурацию и прочитайте переменные окружения
// Automatically read environment variables
var config RestfulConf
conf.MustLoad(configFile, &config, conf.UseEnv())
Войти в полноэкранный режим Выход из полноэкранного режима

Здесь почему нам нужно явно указать conf.UseEnv(), потому что если по умолчанию использовать, может потребоваться escape при записи специфических символов в конфигурации, поэтому по умолчанию переменные окружения не читаются.

Принцип реализации

Обычно мы используем encoding/json или соответствующую библиотеку yaml при реализации парсинга yaml/json, но для go-zero нам нужен более точный контроль над unmarshal, что заставляет нас самостоятельно настроить парсинг yaml/json, полный код здесь.

Код конфигурационного файла: https://github.com/zeromicro/go-zero/tree/master/core/conf

Код парсинга yaml/json: https://github.com/zeromicro/go-zero/tree/master/core/mapping

Это также хороший пример того, как можно использовать reflect и как можно использовать модульные тесты для обеспечения корректности в сложных сценариях.

Резюме

Я всегда рекомендую идею Fail Fast, мы делаем то же самое при загрузке конфигурационных файлов, как только возникает ошибка, сразу выходим, чтобы ops вовремя обнаружил проблему при развертывании сервисов, потому что процесс не успевает запуститься.

Все элементы конфигурации сервисов go-zero загружаются и автоматически проверяются таким образом, включая конфигурацию многих инструментов, которые я написал, также основаны на этом, надеюсь это поможет!

Адрес проекта

https://github.com/zeromicro/go-zero

Добро пожаловать на использование go-zero и звезда, чтобы поддержать нас!

Оцените статью
Procodings.ru
Добавить комментарий