Spring Cloudt整合Netflix Archaius介紹

1.概述

Netflix Archaius 是一個功能強大的配置管理庫。它是一個可用於從許多不同來源收集配置屬性的框架,提供對配置信息的快速及線程安全訪問。

除此之外,Archaius允許屬性在運行時動態更改,使系統無需重新啓動應用程序即可獲得這些變化。

在這個介紹性文章中,我們將設置一個簡單的Spring Cloud Archaius配置,我們將解釋底層發生了什麼,最後,我們將看到Spring如何擴展基本設置。

2. Netflix Archaius功能

衆所周知,Spring Boot已經提供了管理外部化配置的工具,爲什麼還要設置不同的機制呢?

因爲Archaius提供了一些其他任何配置框架都沒有考慮過的方便有趣的功能。其中的一些關鍵點是:

  • 動態和類型屬性
  • 在屬性改變時調用的回調機制
  • 動態配置源(如URL,JDBC和Amazon DynamoDB)的實現
  • Spring Boot Actuator或JConsole可以訪問的JMX MBean,用於檢查和操作屬性
  • 動態屬性驗證

因此,Spring Cloud已經開發了一個庫,可以輕鬆配置“Spring Environment Bridge”,以便Archaius可以從Spring Environment中讀取屬性。

3.依賴性

讓我們將 spring-cloud-starter-netflix-archaius 添加到我們的應用程序中,它將爲我們的項目添加所有必要的依賴項。

或者,我們也可以將spring-cloud-netflix添加到我們的 dependencyManagement 部分,並依賴於其工件版本的規範:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-archaius</artifactId>
</dependency>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-netflixartifactId>
            <version>2.0.1.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        <dependency>
    <dependencies>
<dependencyManagement>

4.用法

一旦我們添加了所需的依賴項,我們就能夠訪問框架管理的屬性:

DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
            .getStringProperty("springcloud.archaius.properties.one", "not found!");
String propertyCurrentValue = dynamicProperty.get();

讓我們以一個簡短的例子來看看它是如何開箱即用的。

4.1 快速示例

默認情況下,它動態管理應用程序類路徑中名爲config.properties的文件中定義的所有屬性。

所以我們將它添加到我們的資源文件夾中,其中包含一些任意屬性:

springcloud.archaius.properties.one=one FROM:config.properties
springcloud.archaius.properties.three=three FROM:config.properties

現在我們需要一種在任何特定時刻檢查屬性值的方法。在這種情況下,我們將創建一個RestController,將值作爲JSON響應檢索:

@RestController
public class ConfigPropertiesController {
    private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
            .getStringProperty("springcloud.archaius.properties.one", "not found!");

    private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
            .getStringProperty("springcloud.archaius.properties.two", "not found!");

    private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
            .getStringProperty("springcloud.archaius.properties.three", "not found!");

    private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
            .getStringProperty("springcloud.archaius.properties.four", "not found!");

    @GetMapping("/properties-from-dynamic")
    public Map<String, String> getPropertiesFromDynamic() {
        Map<String, String> properties = new HashMap<>();
        properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
        properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
        properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
        properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
        return properties;
    }
}

我們來試試吧。我們可以向/properties-from-dynamic發送請求,服務將按預期檢索存儲在config.properties中 的值。

到目前爲止沒什麼大不了的,對吧?好的,讓我們繼續並更改類路徑文件中屬性的值,而無需重新啓動服務。在一分鐘左右之後,對端點的調用應檢索出新值。

接下來,我們將嘗試瞭解幕後發生的事情。

5.它是如何工作的?

首先,讓我們試着理解大局。

Archaius是Apache的Commons Configuration庫的擴展,添加了一些很好的功能,如動態源的輪詢框架,具有高吞吐量和線程安全的實現。

然後 spring-cloud-netflix-archaius 庫進入,合併所有不同的屬性源,並使用這些源自動配置Archaius工具。

5.1 Netflix Archaius庫

它定義了一個複合配置,是可以從不同來源獲得的各種配置的集合。

此外,其中一些配置源可以支持在運行時輪詢更改。Archaius提供接口和一些預定義的實現來配置這些類型的源。

源集合是分層的,因此如果屬性存在於多個配置中,則最終值將是最頂部插槽中的值。

最後, ConfigurationManager處理系統範圍的配置和部署上下文。它可以安裝最終的複合配置,或檢索已安裝的複合配置進行修改。

5.2 Spring Cloud支持

Spring Cloud Archaius庫的主要任務是將所有不同的配置源合併爲 ConcurrentCompositeConfiguration,並使用ConfigurationManager進行安裝 。

庫定義源的優先順序是:

  1. 上下文中定義的任何Apache公共配置AbstractConfiguration bean
  2. Autowired Spring ConfigurableEnvironment中定義的所有源代碼
  3. 默認的Archaius源,我們在上面的例子中看到過
  4. Apache的SystemConfiguration和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環境和應用程序屬性的其餘部分:

@Configuration
public class ApplicationPropertiesConfigurations {
    @Bean
    public AbstractConfiguration addApplicationPropertiesSource() {
        PolledConfigurationSource source = new URLConfigurationSource("classpath:other-config.properties");
        return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
    }
}

幸運的是,它考慮了幾個配置源,我們幾乎可以毫不費力地設置。

7.結論

總而言之,我們已經瞭解了Archaius以及它爲利用配置管理提供的一些很酷的功能。

此外,我們還看到了Spring Cloud自動配置庫如何發揮作用,使我們可以方便地使用該庫的API。

本文中顯示的示例的Github倉庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章