1. 概述
Netflix Archaius 提供庫和功能,用於連接到多種數據源。
在本教程中,我們將學習如何獲取配置:
- 使用 JDBC API 連接到數據庫
- 從 DynamoDB 實例存儲的配置中獲取
- 配置 Zookeeper 作為動態分佈式配置
有關 Netflix Archaius 的介紹,請參閲本文。
2. 使用 Netflix Archaius 與 JDBC 連接
如我們在入門教程中所解釋的,當想要 Archaius 處理配置時,我們需要創建一個 Apache 的 AbstractConfiguration Bean。
該 Bean 將被 Spring Cloud Bridge 自動捕獲並添加到 Archaius 的 Composite Configuration 堆棧中。
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 以驗證我們是否正在使用 spring-cloud-starter-netflix-archaius 啓動器的最新版本。
2.2. 如何創建配置 Bean
在這種情況下,我們需要使用 AbstractConfiguration Bean 實例和 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('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 版本,我們建議使用 Spring Cloud Netflix 庫支持的版本。
aws-java-sdk-dynamodb 依賴將允許我們設置 DynamoDB 客户端以連接到數據庫。
使用 spring-data-dynamodb 庫,我們將設置 DynamoDB 倉庫。
最後,我們將使用 archaius-aws 庫來創建 AbstractConfiguration。
3.2. 使用 DynamoDB 作為配置源
現在,我們將使用一個 DynamoDbConfigurationSource 對象來創建 AbstractConfiguration 對象:
@Autowired
AmazonDynamoDB amazonDynamoDb;
@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
PolledConfigurationSource source = new DynamoDbConfigurationSource(amazonDynamoDb);
return new DynamicConfiguration(
source, new FixedDelayPollingScheduler());
}默認情況下,Archaius 會搜索名為 ‘archaiusProperties’ 的表,該表包含 ‘key’ 和 ‘value’ 屬性,作為其數據源。
如果需要覆蓋這些值,則必須聲明以下系統屬性:
- com.netflix.config.dynamo.tableName
- com.netflix.config.dynamo.keyAttributeName
- com.netflix.config.dynamo.valueAttributeName
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("baeldung.archaius.properties.one", "one FROM:dynamoDB");
repository.save(property);
}我們可以在此方法上進行調用,在創建 DynamoDbConfigurationSource 之前。
現在我們已經準備好運行應用程序。
4. 如何設置動態 ZooKeeper 分佈式配置
正如我們在 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 的 beta 版本。
4.2. Spring Cloud 的自動配置
如官方文檔所述,包括 <em >spring-cloud-starter-zookeeper-config</em> 依賴項,即可設置 Zookeeper 屬性源。
默認情況下,只有一個源被自動配置,它會在 <em >config/application</em> Zookeeper 節點下搜索屬性。 此節點因此被用作不同應用程序之間共享的配置源。
此外,如果使用 <em >spring.application.name</em> 屬性指定應用程序名稱,則會自動配置另一個源,該源會在 <em >config/<app_name></em> 節點中搜索屬性。
每個在這些父節點下的節點名稱將指示一個屬性鍵,其數據將是屬性值。
幸運的是,由於 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/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。