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

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

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

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. Как создать компонент конфигурации

В этом случае нам нужно создать bean- компонент 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('foreach.archaius.properties.one', 'one FROM:jdbc_source');

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

@RestController
public class ConfigPropertiesController {

private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory
.getInstance()
.getStringProperty("foreach.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.valueИмяАтрибута

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("foreach.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/<app_name> .

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

К счастью для нас, поскольку 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/foreach.archaius.properties.one") == null) {
client.create()
.forPath("/config/application/foreach.archaius.properties.one",
"one FROM:zookeeper".getBytes());
} else {
client.setData()
.forPath("/config/application/foreach.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 .