Рубрики
Без рубрики

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

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

Автор оригинала: Ger Roza.

1. Обзор

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

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

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

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

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

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

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

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

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


    
        org.springframework.cloud
        spring-cloud-starter-netflix-archaius
    



    
        
            org.springframework.cloud
            spring-cloud-netflix
            2.0.1.RELEASE
            pom
            import
        
    

Мы можем проверить Maven Central, чтобы убедиться, что мы используем последнюю версию библиотеки starter/|.

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

В этом случае нам нужно будет создать Абстрактная конфигурация боб с помощью JDBCConfigurationSource пример.

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

  • a 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 в памяти с некоторыми исходными данными.

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


    org.springframework.boot
    spring-boot-starter-data-jpa
    2.0.5.RELEASE


    com.h2database
    h2
    1.4.197
    runtime

Примечание: мы можем проверить последние версии библиотек 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 getPropertiesFromDynamic() {
        Map properties = new HashMap<>();
        properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
        return properties;
    }
}

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

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

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

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

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

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


    com.amazonaws
    aws-java-sdk-dynamodb
    1.11.414


    com.github.derjust
    spring-data-dynamodb
    5.0.3


    com.netflix.archaius
    archaius-aws
    0.7.6

Мы можем проверить 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 ищет таблицу с именем “Свойства archaius”, содержащую атрибуты “ключ” и “значение” в базе данных Dynamo для использования в качестве источника.

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

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

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

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

Мы также будем следовать инструкциям руководства, чтобы создать экземпляр Amazon DynamoDB , который мы “подключили” ранее.

И чтобы заполнить базу данных некоторыми исходными данными, мы сначала создадим таблицу DynamoDB entity для сопоставления данных:

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

    @DynamoDBHashKey
    @DynamoDBAttribute
    private String key;

    @DynamoDBAttribute
    private String value;

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

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

public interface ArchaiusPropertiesRepository extends CrudRepository {}

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

@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);
}

Мы можем вызвать этот метод непосредственно перед созданием источника конфигурации DynamoDB .

Теперь мы все готовы запустить приложение.

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

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

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

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

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

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


    org.springframework.cloud
    spring-cloud-starter-zookeeper-config
    2.0.0.RELEASE
    
        
            org.apache.zookeeper
            zookeeper
        
    


    org.apache.zookeeper
    zookeeper
    3.4.13
    
        
            org.slf4j
            slf4j-log4j12
        
    

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

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

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

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

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

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

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

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

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

В этом случае нам также понадобится локальный сервер Zookeeper для хранения конфигураций в виде узлов. Мы можем следовать этому руководству 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. Мы должны принять во внимание, что он также поддерживает другие источники, такие как Etc, Typesafe, файлы AWS S3 и JClouds.

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