1. 概述
Netflix Archaius 是一個強大的配置管理庫。
簡單來説,它是一個框架,可以從多個不同的來源收集配置屬性,並提供快速、線程安全的訪問方式。
此外,該庫允許在運行時動態更改屬性,從而使系統能夠在不重啓應用程序的情況下獲取這些變體。
在本入門教程中,我們將設置一個簡單的 Spring Cloud Archaius 配置,解釋其背後的工作原理,並最終看到 Spring 如何擴展基本配置。
2. Netflix Archaius 功能
正如我們所知,Spring Boot 已經提供了用於管理 外部配置 的工具,因此為什麼要設置不同的機制呢?
好吧,《Archaius》提供了一些方便且有趣的特性,這些特性並未被任何其他配置框架所考慮。 它的主要特點包括:
- 動態和類型化的屬性
- 在屬性發生變更時觸發的調用機制
- 動態配置源的就緒實現,例如 URL、JDBC 和 Amazon DynamoDB
- 一個 JMX MBean,可以通過 Spring Boot Actuator 或 JConsole 訪問,用於檢查和操作屬性
- 動態屬性驗證
這些優勢在許多場景中都非常有用。
因此,Spring Cloud 已經開發了一個庫,允許輕鬆配置“Spring 環境橋”,以便 Archaius 可以從 Spring 環境中讀取屬性。
3. 依賴項
讓我們將 spring-cloud-starter-netflix-archaius 添加到我們的應用程序中,它將為我們的項目添加所有必要的依賴項。
可選地,我們還可以將 spring-cloud-netflix 添加到 dependencyManagement 部分,並依賴其對工件版本的規範:
<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 驗證我們是否使用了最新版本的 啓動器庫。
4. 使用方法
一旦我們添加了所需的依賴項,我們就能訪問由框架管理的所有屬性:
DynamicStringProperty dynamicProperty
= DynamicPropertyFactory.getInstance()
.getStringProperty("baeldung.archaius.property", "default value");
String propertyCurrentValue = dynamicProperty.get();讓我們通過一個簡短的例子來了解其如何直接可用。
4.1. 快速示例
默認情況下,它會動態管理在應用程序類路徑中名為 config.properties 的文件中定義的的所有屬性。
讓我們將其添加到我們的資源文件夾中,並添加一些任意屬性:
#config.properties
baeldung.archaius.properties.one=one FROM:config.properties現在我們需要一種方式來在任何特定時刻檢查屬性的值。在這種情況下,我們將創建一個 RestController,它以 JSON 響應檢索這些值:
@RestController
public class ConfigPropertiesController {
private DynamicStringProperty propertyOneWithDynamic
= DynamicPropertyFactory.getInstance()
.getStringProperty("baeldung.archaius.properties.one", "not found!");
@GetMapping("/property-from-dynamic-management")
public String getPropertyValue() {
return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get();
}
}我們來試試看。我們可以向這個端點發送請求,服務將會從 config.properties 中檢索出存儲的值,正如預期。
目前一切順利,對嗎?好的,我們繼續更改 classpath 文件中屬性的值,而無需重啓服務。結果,大約一分鐘後,對端點的調用應該檢索到新的值。是不是很酷呢?
接下來,我們將嘗試瞭解其背後的運作原理。
5. 它如何工作?
首先,讓我們嘗試理解整體架構。
Archaius 是 Apache Commons Configuration 庫 的擴展,它添加了一些有用的功能,例如用於動態源的輪詢框架,具有高吞吐量和線程安全的實現。
spring-cloud-netflix-archaius 庫隨後發揮作用,它將所有不同的屬性源合併,並使用這些源自動配置 Archaius 工具。
5.1. Netflix Archaius 庫
它通過定義一個複合配置(Composite Configuration),該配置是一系列來自不同來源的各種配置的集合而運作。
此外,這些配置源(Configuration Sources)中的某些可能支持在運行時進行輪詢,以獲取變更。Archaius 提供接口和一些預定義的實現,用於配置這些類型的源。
源的集合是分層化的,因此如果一個屬性在多個配置中存在,則最終值將是頂層配置中的值。
最後,一個ConfigurationManager 處理全局配置和部署上下文。它可以安裝最終的複合配置,或檢索已安裝的配置以進行修改。
5.2. Spring Cloud 支持
Spring Cloud Archaius 庫的主要任務是合併所有不同的配置源,將其作為 <em >ConcurrentCompositeConfiguration</em >> 並使用ConfigurationManager> 安裝。
配置源的優先級順序如下:
- 上下文中的任何 Apache Common Configuration `AbstractConfiguration> Bean
- Spring ConfigurableEnvironment> 中定義的全部源
- 我們在上述示例中看到的默認 Archaius 源
- Apache 的
<em >SystemConfiguration</em >> 和EnvironmentConfiguration> 源
此外,該 Spring Cloud 庫還提供了一個 Actuator `Endpoint> 的定義,用於監控和與屬性進行交互。 其使用方法超出了本教程的範圍。
6. 調整和擴展 Archaius 配置
現在我們對 Archaius 的工作原理有了更深入的瞭解,因此我們準備好分析如何將配置調整為我們的應用程序,或者如何使用配置源來擴展功能。
6.1. Archaius 支持的配置屬性
如果希望 Archaius 能夠考慮與 config.properties 類似的其它配置文件,則可以定義 archaius.configurationSource.additionalUrls 系統屬性。
該值會被解析為一個由逗號分隔的 URL 列表,因此,在啓動應用程序時,我們可以這樣添加該系統屬性:
-Darchaius.configurationSource.additionalUrls=
"classpath:other-dir/extra.properties,
file:///home/user/other-extra.properties"Archaius 將首先讀取 config.properties 文件,然後是其他文件,按照指定順序進行。因此,後文件中定義的屬性將優先於先前定義的屬性。
還有一些其他的系統屬性可以用來配置 Archaius 默認配置的各個方面:
- archaius.configurationSource.defaultFileName: 類路徑中的默認配置文件的名稱
- archaius.fixedDelayPollingScheduler.initialDelayMills: 讀取配置源的初始延遲時間
- archaius.fixedDelayPollingScheduler.delayMills: 兩次讀取源的延遲時間;默認值為 1 分鐘
6.2. 使用 Spring 添加額外的配置源
我們如何向描述的框架中添加不同的配置源,並管理優先級高於 Spring 環境中定義的動態屬性?
如第 4.2 節所述,我們可以意識到,由 Spring 定義的 Composite Configuration 中的最高配置是 AbstractConfiguration 類型的 Bean。
因此,我們只需要使用 Archaius 提供的某些功能,將 Apache 的這個抽象類的實現添加到我們的 Spring Context 中,Spring 的自動配置將自動將其添加到管理配置屬性中。
為了保持簡單,我們將看到一個示例,其中我們配置一個類似於默認的 config.properties 文件的屬性,但其優先級高於 Spring 環境和應用程序屬性。
@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL();
PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL);
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}幸運的是,它考慮了我們可以幾乎無需任何努力設置的多個配置源。這些配置不在本入門教程的範圍內。
7. 結論
綜上所述,我們學習了 Archaius 以及它提供的利用配置管理的一些強大功能。
此外,我們還看到了 Spring Cloud 自配置庫的作用,它允許我們方便地使用該庫的 API。