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