Практика управления конфигурацией распределенной системы на языке Go — go archaius

Микросервисы Go

введение

GitHub.com/go-chassis/…

Архитектура

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

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

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

**Диспетчер событий:** пользователи могут отслеживать изменения конфигурации через Archaius API. Когда элементы конфигурации внутри источника добавляются, обновляются или удаляются, прослушиватель будет уведомлен.

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

Фабрика конфигураций:API, который инкапсулирует менеджер событий и конфигурации

Архай API:Инкапсулирует базовую реализацию и предоставляет удобный API для использования разработчиками.

получить конфигурацию

Существует 2 различных способа получения конфигурации:

1. Вызовите метод Get API-интерфейса archaius.

2. Зарегистрируйте слушателя

Инициирование событий определяется разработчиком источника, и каждый источник ведет себя по-разному:

Командная строка и переменные среды не будут генерировать никаких событий.При запуске archaius элементы конфигурации были определены и могут быть получены только с помощью метода Get. Источник файла извлечет содержимое локального файла и преобразует его в элемент конфигурации после запуска (алгоритм преобразования можно настроить для определения формы элемента конфигурации), а затем продолжит отслеживать изменения в локальном файле. будет обновлен и уведомлен слушатель. Таким образом, оба метода поддерживаются. Поведение источника центра конфигурации отличается от поведения файла.После запуска он периодически извлекает конфигурацию центра конфигурации, сравнивает разницу между каждым элементом конфигурации и запускает различные типы событий.

Форма элемента конфигурации

Предположим, что в программе есть конфигурационный файл с именем a.yaml следующего содержания

registry:
  enabled: true
  interval: 30s

Чтобы рассмотреть, как обращаться с этими необработанными данными, в настоящее время есть два способа:

Во-первых, нужно разделить элементы конфигурации на конфигурации в стиле свойств Java:

registry.refresh: true

registry.interval: 30s

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

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

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

Однако есть тип элемента конфигурации, который не подходит для такого управления, это второй способ, например файл конфигурации управления маршрутизацией в шасси go:

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

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

Настроить горячую перезагрузку во время выполнения

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

Хитрость здесь заключается в использовании блокировок чтения-записи на языке go. Я использую конфигурацию маршрутизации в шасси go, чтобы проиллюстрировать

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

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

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

пример

Пример мониторинга событий локального файла

GitHub.com/go-chassis/…

Пример управления локальными несколькими файлами

GitHub.com/go-chassis/…

Описание Go Chassis

самородки.IM/post/684490…?)