具有各種數據庫配置的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-configzookeeper依賴關係的最新版本。

請確保避免使用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存儲庫中查看所有示例。