Netflix Archaius с различными конфигурациями базы данных

1. Обзор

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

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

  • Использование JDBC API для подключения к базе данных

  • Из конфигураций, хранящихся в экземпляре DynamoDB

  • Путем настройки Zookeeper как динамической распределенной конфигурации

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

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

  • Как мы объяснили во вводном уроке, всякий раз, когда мы хотим, чтобы Archaius обрабатывал конфигурации, нам нужно будет создать компонент 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 и убедиться, что мы используем последнюю версию библиотеки starter .

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

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

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

  • javax.sql.Datasource объект

  • строка SQL-запроса, которая будет получать как минимум два столбца с

ключи конфигурации и соответствующие им значения ** два столбца, указывающие свойства ключей и значения соответственно

Тогда давайте создадим этот боб:

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

Примечание: мы можем проверить последние версии https://search.maven.org/search? Q = g: com.h2database% 20a: h2[h2] и ​​ https://search.maven.org/search ? q = a: spring-boot-starter-data-jpa% 20g: org.springframework.boot[spring-boot-starter-data-jpa] библиотеки в Центральном Maven.

Далее мы объявим объект 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 мы предлагаем придерживаться версии, поддерживаемой https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring . -cloud-netflix-dependencies/pom.xml[библиотека 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. Создание полностью функционального примера

Как мы делали в https://www.baeldung.com/spring-data-dynamodb#DynamoDB в этом руководстве 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

  • Как мы уже видели ранее, https://www.baeldung.com/java-zookeeper , который содержит в себе вступительную статью о Zookeeper], одним из преимуществ этого инструмента является возможность использования его в качестве распределенного хранилища конфигурации. **

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

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

Следуя руководству Spring Cloud по официальной инструкции , чтобы настроить более стабильную версию Апачский зоопарк.

Единственное отличие состоит в том, что нам нужна только часть функциональности, предоставляемой 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

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

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

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

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

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

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

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

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

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

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