ГОЛАНГ: КАК НАПРАВЛЯТЬ

Упростите конфигурацию вашего приложения в Go

Легко читайте, записывайте и управляйте конфигурациями вашего приложения из удаленных источников с помощью Viper (Go open-source)

Введение

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

Задумайтесь — сколько раз коллега создавал программу, которая требовала конфиг, но нигде его не выкладывала? Или в разных местах что-то было настроено по-разному?

Или забыли обновить систему по пути?

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

Централизация того, как ваши приложения могут читать все свои конфигурации одновременно, очень важна, особенно когда все, что вам нужно сделать, это обновить конфигурации один раз, и бум! Готово.

Распределенная обработка, совместная работа в команде, прозрачность и доступность улучшаются почти мгновенно.

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

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



❗️TL;DR:

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

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

Если у вас есть большое приложение Go или распределенные приложения Go, где требуется согласованность, Viper становится проще простого. Он отделяет ваши приложения от их конфигураций, позволяя вам удобно масштабироваться.

Краткое предисловие

Что вы узнаете

К концу этой статьи вы должны уметь:

  • Читайте и получайте доступ к конфигурациям из удаленных источников и используйте их в своем приложении Go.
  • Передайте их Viper, чтобы все ваши конфигурации были стандартизированы, доступны и управлялись централизованно.
  • Наблюдайте за изменениями конфигурации из удаленного источника и предоставляйте самые последние конфигурации вашему приложению, как только они будут внесены.

Предпосылки

Чтобы продолжить, вам, вероятно, понадобится:

  • Умеренное понимание Go
  • Знакомство с Firebase и Cloud Firestore (рекомендуется)

📌 Отказ от ответственности. Это вторая из двух статей. В предыдущей статье мы сосредоточились на функциях Viper и на том, как их использовать для управления конфигами из локальных источников (и переменных среды). Чтобы узнать больше, см. статью ниже:



Начиная

Чтение удаленных хранилищ ключей и значений с помощью Viper

Хорошая новость заключается в том, что Viper предоставляет нам инструменты для чтения конфигураций из удаленных хранилищ, таких как Cloud Firestore, Consul, etcd и т. д. Они встроены в Viper, и для их настройки требуется всего несколько строк.

📖 Дополнительная информация: Вы можете узнать больше здесь или с помощью приведенного ниже кода👇

viper.AddRemoteProvider("firestore", "google-cloud-project-id", "collection/document")
viper.SetConfigType("json")
err := viper.ReadRemoteConfig()

Однако, хотя встроенная поддержка удаленных хранилищ великолепна, иногда она может быть негибкой, особенно когда вы хотите хранить конфигурации в предпочитаемом вами хранилище. Хорошим примером этого является поддержка Firestore (см., например, здесь).

💡 Совет эксперта: просто помните о возможных ограничениях Viper в будущем, вот и все. Он не идеален, но при правильном использовании и в правильных обстоятельствах он действительно может быть полезным.

Чтение конфигов из непредопределенных источников

Встроенные инструменты Viper великолепны, но я хочу сосредоточиться на чтении конфигураций из любого желаемого удаленного хранилища. [Это будет более полезно, верно?]

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

Для начала мы будем использовать метод viper.ReadConfigs, предоставленный Viper, который позволит нам передавать ему любые данные, которые мы хотим.

viper.ReadConfigs принимает io.Reader, и данные, которые мы ему передаем, могут поступать из любого источника. Это просто должно быть в формате, понятном Viper (например, JSON, YAML и т. д.):

Нам также нужно сообщить Viper формат, который мы используем. Сделаем это через метод viper.SetConfigType, в нашем случае над JSON ☝️.

Установка зависимостей и получение необходимых учетных данных

Чтобы прочитать конфигурации из Cloud Firestore, мы начнем с установки пакета Firebase для Go и Viper, используя go get:

go get firebase.google.com/go
go get github.com/spf13/viper

Затем нам потребуются учетные данные для авторизации нашего приложения Go для доступа к Firebase Cloud Firestore. Мы будем использовать сервисные учетные записи для аутентификации наших приложений Go в Firebase, что позволит нам запрашивать нашу базу данных Cloud Firestore.

📖 Дополнительная информация: Узнайте больше об учетных записях службы Firebase здесь

Мы также сохраним файл учетных данных, полученный от Firebase/Google Cloud Platform, в нашей файловой системе; обратите внимание на путь, так как он понадобится нам на следующем шаге.

👉 Примечание. (1) Не фиксируйте файл учетных данных, который вы собираетесь получить из Firebase; (2) Учетная запись службы позволяет вам получить доступ ко всем службам Firebase, и если вы используете ее в рабочей среде, рекомендуется разрешать доступ только к необходимым службам с помощью ваших учетных данных. Вы можете узнать больше о том, как управлять учетными данными как в Firebase, так и в Google Platform здесь.

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

Управление конфигурациями из Cloud Firestore

Чтение конфигураций из Cloud Firestore

Далее нам нужно создать клиент Firestore, который мы можем использовать для получения и просмотра изменений в нашем документе Firestore.

Это также место, где нам нужен наш файл учетных данных, используя метод option.WithCredentialsFile(), передавая путь к файлу учетных данных в качестве аргумента. Затем нам нужно передать полученную переменную в метод firebase.NewApp():

Далее, поскольку теперь у нас есть клиент, мы можем продолжить и прочитать документ конфигурации из Cloud Firestore, как показано ниже.

Cloud Firestore — это база данных NoSQL, ориентированная на документы. Все документы являются частью коллекции (аналогично таблицам).

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

📖 Дополнительная литература: Для получения дополнительной информации о структуре Cloud Firestore, пожалуйста, ознакомьтесь с официальной документацией здесь

В нашем случае выше мы обращаемся к коллекции с именем configs и документу с идентификатором config.

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

Когда мы читаем данные, мы преобразуем полученные данные карты в JSON, чтобы мы могли передать их в Viper, используя метод ReadConfig. ReadConfig принимает io.Reader, что позволяет нам передавать конфигурации из любого источника в Viper:

На данный момент мы можем прочитать наши конфигурации из Cloud Firestore, как и любую другую конфигурацию, как если бы она была получена из любого другого источника с помощью Viper:

Просмотр изменений конфигурации из Cloud Firestore

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

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

К счастью для нас, с Cloud Firestore мы можем автоматически прослушивать изменения либо в коллекции, либо в конкретном документе, используя метод Snapshots.

👉 Примечание. Snapshots возвращает новый снимок всякий раз, когда в последний снимок данных вносятся изменения.

Мы будем использовать этот метод для прослушивания изменений в нашем документе конфигурации и использовать viper.ReadConfigs для обновления конфигураций в нашем приложении:

Что делать, если мой источник конфигурации не имеет этой возможности?

В этом случае вы можете выбрать «решение для опроса», при котором вы будете проверять через разумные промежутки времени, чтобы узнать, не изменились ли конфигурации:

Вот и все; любые изменения в нашем конфигурационном документе Cloud Firestore будут автоматически отражены в нашем приложении. Вот как теперь должен выглядеть наш код:

Использование нашей конфигурации в нашем приложении

Давайте настроим Viper для нашего приложения и используем приведенную выше конфигурацию. Нам нужно сообщить Viper, что формат нашего файла конфигурации — JSON, так как мы маршалируем наши данные из Cloud Firestore в JSON.

👉 Примечание. Мы запускаем нашу функцию для извлечения удаленных конфигураций внутри подпрограммы Go, чтобы мы могли асинхронно прослушивать обновления из Cloud Firestore и автоматически обновлять конфигурации viper, не блокируя основной поток.

… и мы закончили!

Вопросы? Комментарии? Не стесняйтесь оставлять их ниже👇 и дайте мне знать, что вы думаете.

Заключение

Короче говоря, мы узнали, как использовать Cloud Firestore в качестве источника для наших конфигураций, а также как мы можем запрашивать Cloud Firestore, читать данные и передавать их в Viper для использования в нашем приложении.

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

Ключевые выводы

  • Viper предоставляет нам встроенные инструменты для чтения конфигураций из удаленных хранилищ, таких как Cloud Firestore, Consul, etcd и т. д., которые можно настроить довольно быстро.
  • Если вы хотите читать конфигурации из удаленного хранилища, вам, вероятно, потребуется создать собственную версию чтения источников конфигурации. Затем следите за изменениями конфигурации и обновляйте их соответствующим образом.
  • Для этого используйте viper.ReadConfigs для передачи конфигураций в Viper из источников, которые Viper не поддерживает напрямую.
  • Мы можем автоматически прослушивать изменения в Cloud Firestore либо в коллекции, либо в конкретном документе, используя метод Snapshots, и передавать изменения в Viper.
  • Наконец, не забудьте правильно установить формат для ваших конфигураций. Это может свести вас с ума, если вы пропустите это.

Другие статьи для рассмотрения





Раскрытие информации: в соответствии с правилами и рекомендациями Medium.com я публично подтверждаю финансовую компенсацию от UniDoc за эту статью. Все мысли, мнения, код, изображения, записи и т. д. принадлежат мне.