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 .