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 .