Перейти к основному содержимому

Введение в Netflix Archaius с Spring Cloud

· 6 мин. чтения

1. Обзор

Netflix Archaius — это мощная библиотека управления конфигурацией.

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

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

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

2. Возможности Netflix Archaius

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

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

  • Динамические и типизированные свойства
  • Механизм обратного вызова, который вызывается при изменении свойств.
  • Готовые к использованию реализации источников динамической конфигурации, таких как URL-адреса, JDBC и Amazon DynamoDB.
  • JMX MBean, к которому может обращаться Spring Boot Actuator или JConsole для проверки свойств и управления ими.
  • Проверка динамических свойств

Эти льготы могут быть полезны во многих сценариях.

Поэтому Spring Cloud работал над библиотекой, которая позволяет легко настроить «Мост Spring Environment», чтобы Archaius мог считывать свойства из Spring Environment.

3. Зависимости

Добавим в наше приложение spring-cloud-starter-netflix-archaius , он добавит все необходимые зависимости в наш проект .

При желании мы также можем добавить spring-cloud-netflix в наш раздел dependencyManagement и полагаться на его спецификацию версий артефактов:

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>2.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

Примечание: мы можем проверить Maven Central, чтобы убедиться, что мы используем последнюю версию начальной библиотеки .

4. Использование

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

DynamicStringProperty dynamicProperty 
= DynamicPropertyFactory.getInstance()
.getStringProperty("foreach.archaius.property", "default value");

String propertyCurrentValue = dynamicProperty.get();

Давайте поработаем на коротком примере, чтобы увидеть, как это доступно прямо из коробки.

4.1. Быстрый пример

По умолчанию он динамически управляет всеми свойствами, определенными в файле с именем config.properties в пути к классам приложения .

Итак, давайте добавим его в нашу папку ресурсов с некоторыми произвольными свойствами:

#config.properties
foreach.archaius.properties.one=one FROM:config.properties

Теперь нам нужен способ проверить значения свойств в любой конкретный момент. В этом случае мы создадим RestController , который извлекает значения в виде ответа JSON:

@RestController
public class ConfigPropertiesController {

private DynamicStringProperty propertyOneWithDynamic
= DynamicPropertyFactory.getInstance()
.getStringProperty("foreach.archaius.properties.one", "not found!");

@GetMapping("/property-from-dynamic-management")
public String getPropertyValue() {
return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get();
}
}

Давайте попробуем. Мы можем отправить запрос на эту конечную точку, и служба получит значения, хранящиеся в config.properties , как и ожидалось.

Пока ничего страшного, верно? Хорошо, давайте продолжим и изменим значения свойства в файле пути к классам, не перезапуская службу. В результате через минуту или около того вызов конечной точки должен получить новые значения. Довольно круто, не правда ли?

Далее попробуем разобраться, что творится под капотом.

5. Как это работает?

Прежде всего, давайте попытаемся понять общую картину.

Archaius — это расширение библиотеки Apache Commons Configuration , добавляющее некоторые приятные функции, такие как структура опроса для динамических источников, с высокой пропускной способностью и поточно-ориентированной реализацией.

Затем в игру вступает библиотека spring-cloud-netflix-archaius , объединяющая все различные источники свойств и автоматически настраивающая инструменты Archaius с этими источниками.

5.1. Библиотека Архая Netflix

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

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

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

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

5.2. Поддержка весеннего облака

Основная задача библиотеки Spring Cloud Archaius — объединить все различные источники конфигурации в виде ConcurrentCompositeConfiguration и установить его с помощью ConfigurationManager.

Порядок приоритета, в котором библиотека определяет источники:

  1. Любой bean-компонент Apache Common Configuration AbstractConfiguration , определенный в контексте
  2. Все источники, определенные в Autowired Spring ConfigurableEnvironment
  3. Исходники Archaius по умолчанию, которые мы видели в примере выше
  4. Исходники Apache SystemConfiguration и EnvironmentConfiguration

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

6. Адаптация и расширение конфигурации Archaius

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

6.1. Свойства конфигурации, поддерживаемые Archaius

Если мы хотим, чтобы Archaius учитывал другие файлы конфигурации, подобные config.properties , мы можем определить системное свойство archaius.configurationSource.additionalUrls .

Значение преобразуется в список URL-адресов, разделенных запятой, поэтому, например, мы можем добавить это системное свойство при запуске приложения:

-Darchaius.configurationSource.additionalUrls=
"classpath:other-dir/extra.properties,
file:///home/user/other-extra.properties"

Archaius сначала прочитает файл config.properties , а затем остальные в указанном порядке. Из-за этого свойства, определенные в последних файлах, будут иметь приоритет над предыдущими.

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

  • archaius.configurationSource.defaultFileName : имя файла конфигурации по умолчанию в пути к классам
  • archaius.fixedDelayPollingScheduler.initialDelayMills : начальная задержка перед чтением источника конфигурации
  • archaius.fixedDelayPollingScheduler.delayMills : задержка между двумя чтениями источника; значение по умолчанию 1 минута

6.2. Добавление дополнительных источников конфигурации с помощью Spring

Как мы можем добавить другой источник конфигурации, которым будет управлять описанная структура? И как мы можем управлять динамическими свойствами с более высоким приоритетом, чем те, которые определены в среде Spring?

Изучив то, что мы упоминали в разделе 4.2, мы можем понять, что самые высокие конфигурации в Composite Configuration, определенные Spring, — это bean-компоненты AbstractConfiguration , определенные в контексте.

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

Для простоты мы увидим пример, в котором мы настраиваем файл свойств, аналогичный файлу config.properties по умолчанию, но с той разницей, что он имеет более высокий приоритет, чем остальные свойства среды Spring и приложения:

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL();
PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL);
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}

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

7. Заключение

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

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

Еще раз, мы можем найти все примеры, показанные в этом руководстве, и другие в нашем репозитории Github .