«1. Обзор

Netflix Archaius предлагает библиотеки и функции для подключения ко многим источникам данных.

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

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

Для ознакомления с Netflix Archaius, пожалуйста, ознакомьтесь с этой статьей.

2. Использование Netflix Archaius с соединением JDBC

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

Компонент будет автоматически перехвачен Spring Cloud Bridge и добавлен в стек составной конфигурации Archaius.

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

Вся функциональность, необходимая для подключения к базе данных с помощью JDBC, включена в основную библиотеку, поэтому нам не потребуются никакие дополнительные зависимости, кроме тех, которые мы упомянули во вводном руководстве:

<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, чтобы убедиться, что мы используем последнюю версию начальной библиотеки.

2.2. Как создать компонент конфигурации

В этом случае нам нужно создать компонент AbstractConfiguration, используя экземпляр JDBCConfigurationSource.

Чтобы указать, как получить значения из базы данных JDBC, мы должны указать:

    объект javax.sql.Datasource строку запроса SQL, которая будет извлекать как минимум два столбца с ключами конфигурации и их соответствующие значения два столбца с указанием ключей и значений свойств соответственно

Давайте продолжим, создадим этот bean-компонент:

@Autowired
DataSource dataSource;

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
    PolledConfigurationSource source =
      new JDBCConfigurationSource(dataSource,
        "select distinct key, value from properties",
        "key",
        "value");
    return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}

2.3. Пробуем

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

Для этого мы сначала добавим необходимые зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
    <scope>runtime</scope>
</dependency>

Примечание: мы можем проверить последние версии библиотек h2 и spring-boot-starter-data-jpa в Maven Central.

Далее мы объявим объект JPA, который будет содержать наши свойства:

@Entity
public class Properties {
    @Id
    private String key;
    private String value;
}

И мы включим файл data.sql в наши ресурсы, чтобы заполнить базу данных в памяти некоторыми начальными значениями: ~ ~~

insert into properties
values('baeldung.archaius.properties.one', 'one FROM:jdbc_source');

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

@RestController
public class ConfigPropertiesController {

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

    @GetMapping("/properties-from-dynamic")
    public Map<String, String> getPropertiesFromDynamic() {
        Map<String, String> properties = new HashMap<>();
        properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
        return properties;
    }
}

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

Конечно, эту конечную точку можно использовать и в следующих примерах.

3. Как создать источник конфигурации с использованием экземпляра DynamoDB

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

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

Давайте добавим следующие библиотеки в наш файл pom.xml:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-dynamodb</artifactId>
    <version>1.11.414</version>
</dependency>
<dependency>
    <groupId>com.github.derjust</groupId>
    <artifactId>spring-data-dynamodb</artifactId>
    <version>5.0.3</version>
</dependency>
<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-aws</artifactId>
    <version>0.7.6</version>
</dependency>

Мы можем проверить Maven Central на наличие последних версий зависимостей, но для библиотеки archaius-aws мы предлагаем придерживаться версии, поддерживаемой Библиотека Spring Cloud Netflix.

Зависимость aws-java-sdk-dynamodb позволит нам настроить клиент DynamoDB для подключения к базе данных.

С библиотекой spring-data-dynamodb мы настроим репозиторий DynamoDB.

И, наконец, мы будем использовать библиотеку archaius-aws для создания AbstractConfiguration.

3.2. Использование DynamoDB в качестве источника конфигурации

На этот раз AbstractConfiguration будет создан с использованием объекта DynamoDbConfigurationSource:

@Autowired
AmazonDynamoDB amazonDynamoDb;

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
    PolledConfigurationSource source = new DynamoDbConfigurationSource(amazonDynamoDb);
    return new DynamicConfiguration(
      source, new FixedDelayPollingScheduler());
}

По умолчанию Archaius ищет таблицу с именем «archaiusProperties», содержащую «ключ» и атрибут «значение» в базе данных Dynamo для использования в качестве источника.

Если мы хотим переопределить эти значения, мы должны объявить следующие системные свойства:

    com.netflix.config.dynamo.tableName com.netflix.config.dynamo.keyAttributeName com.netflix.config.dynamo .valueAttributeName

3.3. Создание полнофункционального примера

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

Мы также будем следовать инструкциям руководства по созданию инстанса AmazonDynamoDB, который мы ранее «автоматически подключили».

И чтобы заполнить базу данных исходными данными, мы сначала создадим сущность DynamoDBTable для сопоставления данных:

@DynamoDBTable(tableName = "archaiusProperties")
public class ArchaiusProperties {

    @DynamoDBHashKey
    @DynamoDBAttribute
    private String key;

    @DynamoDBAttribute
    private String value;

    // ...getters and setters...
}

Затем мы создадим CrudRepository для этой сущности:

public interface ArchaiusPropertiesRepository extends CrudRepository<ArchaiusProperties, String> {}

И, наконец, мы будем использовать репозиторий и экземпляр AmazonDynamoDB для создания таблицы и последующей вставки данных:

@Autowired
private ArchaiusPropertiesRepository repository;

@Autowired
AmazonDynamoDB amazonDynamoDb;

private void initDatabase() {
    DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDb);
    CreateTableRequest tableRequest = mapper
      .generateCreateTableRequest(ArchaiusProperties.class);
    tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1L, 1L));
    TableUtils.createTableIfNotExists(amazonDynamoDb, tableRequest);

    ArchaiusProperties property = new ArchaiusProperties("baeldung.archaius.properties.one", "one FROM:dynamoDB");
    repository.save(property);
}

Мы можем вызвать этот метод прямо перед созданием DynamoDbConfigurationSource.

Теперь все готово для запуска приложения.

4. Как настроить динамическую распределенную конфигурацию Zookeeper

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

Если мы объединим его с Archaius, мы получим гибкое и масштабируемое решение для управления конфигурацией.

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

Давайте следуем официальным инструкциям Spring Cloud, чтобы настроить более стабильную версию Apache Zookeeper.

Единственная разница в том, что нам нужна только часть функций, предоставляемых Zookeeper, поэтому мы можем использовать зависимость spring-cloud-starter-zookeeper-config вместо той, что используется в официальном руководстве:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
    <version>2.0.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.13</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

~~ ~ Опять же, мы можем проверить последние версии зависимостей spring-cloud-starter-zookeeper-config и zookeeper в Maven Central.

Пожалуйста, избегайте бета-версий zookeeper.

4.2. Автоматическая настройка Spring Cloud

Как объясняется в официальной документации, включения зависимости spring-cloud-starter-zookeeper-config достаточно для настройки источников свойств Zookeeper.

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

Кроме того, если мы указываем имя приложения с помощью свойства spring.application.name, автоматически настраивается другой источник, на этот раз ищущий свойства в узле config/\u003capp_name\u003e.

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

К счастью для нас, поскольку Spring Cloud добавляет эти источники свойств в контекст, Archaius управляет ими автоматически. Нет необходимости программно создавать AbstractConfiguration.

4.3. Подготовка исходных данных

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

Чтобы подключиться к службе Zookeeper и создать некоторые начальные данные, мы будем использовать клиент Apache Curator:

@Component
public class ZookeeperConfigsInitializer {

    @Autowired
    CuratorFramework client;

    @EventListener
    public void appReady(ApplicationReadyEvent event) throws Exception {
        createBaseNodes();
        if (client.checkExists().forPath("/config/application/baeldung.archaius.properties.one") == null) {
            client.create()
              .forPath("/config/application/baeldung.archaius.properties.one",
              "one FROM:zookeeper".getBytes());
        } else {
            client.setData()
              .forPath("/config/application/baeldung.archaius.properties.one",
              "one FROM:zookeeper".getBytes());
        }
    }

    private void createBaseNodes() throws Exception {
        if (client.checkExists().forPath("/config") == null) {
            client.create().forPath("/config");
        }
        if (client.checkExists().forPath("/config/application") == null) {
            client.create().forPath("/config/application");
        }
    }
}

Мы можем проверьте журналы, чтобы увидеть источники свойств, чтобы убедиться, что Netflix Archaius обновил свойства после их изменения.

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

В этой статье мы узнали, как настроить дополнительные источники конфигурации с помощью Netflix Archaius. Мы должны принять во внимание, что он поддерживает и другие источники, такие как Etcd, Typesafe, файлы AWS S3 и JClouds.

Как всегда, мы можем проверить все примеры в нашем репозитории Github.