«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("baeldung.archaius.property", "default value");

String propertyCurrentValue = dynamicProperty.get();

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

4.1. Краткий пример

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

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

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

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

@RestController
public class ConfigPropertiesController {
	
    private DynamicStringProperty propertyOneWithDynamic
      = DynamicPropertyFactory.getInstance()
      .getStringProperty("baeldung.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

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

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

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

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

5.2. Поддержка Spring Cloud

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

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

  1. Any Apache Common Configuration AbstractConfiguration bean defined in the context
  2. All the sources defined in the Autowired Spring ConfigurableEnvironment
  3. The default Archaius sources, which we saw in the example above
  4. Apache’s SystemConfiguration and EnvironmentConfiguration sources

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

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.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.