-
Notifications
You must be signed in to change notification settings - Fork 5
RU:Config
Реализация интерфейса https://pkg.go.dev/go.unistack.org/micro/v3/config#Config
Конфиг источники представляют собой методы Save/Load/Watch для заполнения конфигурационного файла из различных источников.
Микросервис предоставляет возможность стекировать конфиг сурсы, а также динамически перенастраивать сервис в зависимости от значений конфигурационной структуры посредством метода Watch.
Наиболее известный вариант использования конфигурационных источников в следующем варианте
cfg := appconfig.NewConfig(appName, AppVersion) // create new empty config
if err := config.Load(ctx,
[]config.Config{
config.NewConfig( // load from defaults
config.Struct(cfg), // pass config struct
),
fileconfig.NewConfig( // load from file
config.AllowFail(true), // that may be not exists
config.Struct(cfg), // pass config struct
config.Codec(jsoncodec.NewCodec()), // file config in json
fileconfig.Path("./local.json"), // nearby file
),
envconfig.NewConfig( // load from environment
config.Struct(cfg), // pass config struct
),
vaultconfig.NewConfig(
config.AllowFail(true), // that may be not exists
config.Struct(cfg), // load from vault
config.Codec(jsoncodec.NewCodec()), // vault config in json
config.BeforeLoad(func(ctx context.Context, c config.Config) error {
return c.Init(
vaultconfig.Address(cfg.Vault.Addr),
vaultconfig.Token(cfg.Vault.Token),
vaultconfig.Path(cfg.Vault.Path),
)
}),
),
}, config.LoadOverride(true),
); err != nil {
logger.Fatalf(ctx, "failed to load config: %v", err)
}
В таком варианте создается стек из источников конфигурации, которые обрабатываются в указанном порядке.
- Конфигурационная структура заполняется параметрами по-умолчанию (параметры задаются посредством аннотаций к полям структуры)
- Чтение из локального файла в формате json/yaml/toml (удобно для локального тестирования)
- Чтение из переменных окружения (обычно используется в кубернетес для задания параметров для следующих конфигурационных источников)
- Чтение из vault конфигурационного файла в котором помимо прочего могут содержаться различные пароли и сертификаты
В конечном итоге существующие значения перезаписываются (опция config.LoadOverride(true)), для массивов или мап можно указать опцию для дополнения, вместо перезаписи значений.
Методы
func Load(context.Context, ...config.LoadOption) error