具有各種數據庫配置的Netflix Archaius
1.概述
Netflix Archaius提供了用於連接許多數據源的庫和功能。
在本教程中,我們將學習如何獲取配置**:**
- 使用JDBC API連接到數據庫
- 來自DynamoDB實例中存儲的配置
- 通過將Zookeeper配置為動態分佈式配置
有關Netflix Archaius的介紹,請查看本文。
2.通過JDBC連接使用Netflix Archaius
正如我們在入門教程中所解釋的那樣,每當我們希望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以確認我們使用的是最新版本的入門庫。
2.2。如何創建配置Bean
在這種情況下,我們需要使用JDBCConfigurationSource
實例創建AbstractConfiguration
bean。
為了指示如何從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>
注意:我們可以在Maven Central中檢查[h2](https://search.maven.org/search?q=g:com.h2database%20a:h2)
和[spring-boot-starter-data-jpa](https://search.maven.org/search?q=a:spring-boot-starter-data-jpa%20g:org.springframework.boot)
庫的最新版本。
接下來,我們將聲明將包含我們的屬性的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實例創建配置源
如上一節所述,我們將創建一個功能齊全的項目,以使用DynamoDB實例作為配置源來正確分析Archaius如何管理屬性。
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”的表,該表在Dynamo數據庫中包含“鍵”和“值”屬性以用作源。
如果要覆蓋這些值,則必須聲明以下系統屬性:
-
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入門文章中所見,該工具的優點之一是可以將其用作分佈式配置存儲。
如果將其與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>
同樣,我們可以在Maven Central中檢查spring-cloud-starter-zookeeper-config
和zookeeper
依賴關係的最新版本。
請確保避免使用zookeeper
beta版本。
4.2。 Spring Cloud的自動配置
如官方文檔中所述,包括spring-cloud-starter-zookeeper-config
依賴關係足以設置Zookeeper屬性源。
默認情況下,僅自動配置一個源,在config/application
Zookeeper節點下搜索屬性。因此,此節點用作不同應用程序之間的共享配置源。
另外,如果我們使用spring.application.name
屬性指定應用程序名稱, 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/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。
與往常一樣,我們可以在Github存儲庫中查看所有示例。