Spring Cloudt整合Netflix Archaius介紹

1.概述

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

除此之外军俊,Archaius允許屬性在運行時動態(tài)更改废士,使系統(tǒng)無需重新啟動應(yīng)用程序即可獲得這些變化。

在這個介紹性文章中蝇完,我們將設(shè)置一個簡單的Spring Cloud Archaius配置官硝,我們將解釋底層發(fā)生了什么矗蕊,最后,我們將看到Spring如何擴展基本設(shè)置氢架。

2. Netflix Archaius功能

眾所周知傻咖,Spring Boot已經(jīng)提供了管理外部化配置的工具,為什么還要設(shè)置不同的機制呢岖研?

因為Archaius提供了一些其他任何配置框架都沒有考慮過的方便有趣的功能卿操。其中的一些關(guān)鍵點是:

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

因此害淤,Spring Cloud已經(jīng)開發(fā)了一個庫,可以輕松配置“Spring Environment Bridge”拓售,以便Archaius可以從Spring Environment中讀取屬性窥摄。

3.依賴性

讓我們將 spring-cloud-starter-netflix-archaius 添加到我們的應(yīng)用程序中,它將為我們的項目添加所有必要的依賴項础淤。

或者崭放,我們也可以將spring-cloud-netflix添加到我們的 dependencyManagement 部分,并依賴于其工件版本的規(guī)范:

<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 快速示例

默認情況下,它動態(tài)管理應(yīng)用程序類路徑中名為config.properties的文件中定義的所有屬性玻侥。

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

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

現(xiàn)在我們需要一種在任何特定時刻檢查屬性值的方法。在這種情況下凑兰,我們將創(chuàng)建一個RestController蜜徽,將值作為JSON響應(yīng)檢索:

@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發(fā)送請求票摇,服務(wù)將按預(yù)期檢索存儲在config.properties中 的值拘鞋。

到目前為止沒什么大不了的,對吧矢门?好的盆色,讓我們繼續(xù)并更改類路徑文件中屬性的值,而無需重新啟動服務(wù)祟剔。在一分鐘左右之后隔躲,對端點的調(diào)用應(yīng)檢索出新值。

接下來物延,我們將嘗試了解幕后發(fā)生的事情宣旱。

5.它是如何工作的?

首先叛薯,讓我們試著理解大局浑吟。

Archaius是Apache的Commons Configuration庫的擴展笙纤,添加了一些很好的功能,如動態(tài)源的輪詢框架组力,具有高吞吐量和線程安全的實現(xiàn)省容。

然后 spring-cloud-netflix-archaius 庫進入,合并所有不同的屬性源燎字,并使用這些源自動配置Archaius工具腥椒。

5.1 Netflix Archaius庫

它定義了一個復(fù)合配置,是可以從不同來源獲得的各種配置的集合候衍。

此外笼蛛,其中一些配置源可以支持在運行時輪詢更改。Archaius提供接口和一些預(yù)定義的實現(xiàn)來配置這些類型的源蛉鹿。

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

最后, ConfigurationManager處理系統(tǒng)范圍的配置和部署上下文煌茴。它可以安裝最終的復(fù)合配置随闺,或檢索已安裝的復(fù)合配置進行修改。

5.2 Spring Cloud支持

Spring Cloud Archaius庫的主要任務(wù)是將所有不同的配置源合并為 ConcurrentCompositeConfiguration蔓腐,并使用ConfigurationManager進行安裝 矩乐。

庫定義源的優(yōu)先順序是:

  1. 上下文中定義的任何Apache公共配置AbstractConfiguration bean
  2. Autowired Spring ConfigurableEnvironment中定義的所有源代碼
  3. 默認的Archaius源,我們在上面的例子中看到過
  4. Apache的SystemConfiguration和EnvironmentConfiguration 源

Spring Cloud庫提供的另一個有用功能是定義一個Actuator Endpoint 來監(jiān)控屬性并與之交互回论。

6.調(diào)整和擴展Archaius配置

現(xiàn)在我們已經(jīng)更好地理解了Archaius的工作原理散罕,我們很好地分析了如何使配置適應(yīng)我們的應(yīng)用程序,或者如何使用我們的配置源擴展功能傀蓉。

6.1 Archaius支持的配置屬性

如果我們希望Archaius考慮類似于config.properties的其他配置文件 欧漱,我們可以定義 archaius.configurationSource.additionalUrls系統(tǒng)屬性。

該值被解析為由逗號分隔的URL列表葬燎,因此误甚,例如,我們可以在啟動應(yīng)用程序時添加此系統(tǒng)屬性:

-Darchaius.configurationSource.additionalUrls="classpath:other-dir/extra.properties,file:///home/user/other-extra.properties"

Archaius將首先讀取config.properties文件谱净,然后按指定的順序讀取其他文件窑邦。因此,后面文件中定義的屬性將優(yōu)先于先前的屬性壕探。

我們可以使用幾個其他系統(tǒng)屬性來配置Archaius默認配置的各個方面:

  • archaius.configurationSource.defaultFileName:類路徑中的默認配置文件名
  • archaius.fixedDelayPollingScheduler.initialDelayMills:讀取配置源之前的初始延遲
  • archaius.fixedDelayPollingScheduler.delayMills:兩次讀取源之間的延遲; 默認值為1分鐘

6.2 使用Spring添加其他配置源

我們?nèi)绾翁砑右粋€不同的配置源來由所描述的框架管理冈钦?我們?nèi)绾喂芾韮?yōu)先級高于Spring環(huán)境中定義的動態(tài)屬性?

回顧我們在4.2節(jié)中提到的內(nèi)容李请,我們可以發(fā)現(xiàn)Spring定義的Composite Configuration中的最高配置是在上下文中定義的 AbstractConfiguration bean瞧筛。

因此厉熟,我們需要做的就是使用Archaius提供的一些功能將這個Apache的抽象類的實現(xiàn)添加到我們的Spring Context中,Spring的自動配置會自動將它添加到托管配置屬性中驾窟。

為了簡單起見庆猫,我們將看到一個示例,我們配置一個類似于默認config.properties的屬性文件绅络,但其優(yōu)先級高于Spring環(huán)境和應(yīng)用程序?qū)傩缘钠溆嗖糠郑?/p>

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

幸運的是月培,它考慮了幾個配置源,我們幾乎可以毫不費力地設(shè)置恩急。

7.結(jié)論

總而言之杉畜,我們已經(jīng)了解了Archaius以及它為利用配置管理提供的一些很酷的功能。

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

本文中顯示的示例的Github倉庫随珠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灭袁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窗看,更是在濱河造成了極大的恐慌茸歧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件显沈,死亡現(xiàn)場離奇詭異软瞎,居然都是意外死亡,警方通過查閱死者的電腦和手機拉讯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門涤浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魔慷,你說我怎么就攤上這事只锭。” “怎么了院尔?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵纹烹,是天一觀的道長。 經(jīng)常有香客問我召边,道長铺呵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任隧熙,我火速辦了婚禮片挂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己音念,他們只是感情好沪饺,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闷愤,像睡著了一般整葡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥脐,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天遭居,我揣著相機與錄音,去河邊找鬼旬渠。 笑死俱萍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的告丢。 我是一名探鬼主播枪蘑,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岖免!你這毒婦竟也來了岳颇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤颅湘,失蹤者是張志新(化名)和其女友劉穎话侧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栅炒,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡掂摔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年术羔,在試婚紗的時候發(fā)現(xiàn)自己被綠了赢赊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡级历,死狀恐怖释移,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寥殖,我是刑警寧澤玩讳,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站嚼贡,受9級特大地震影響熏纯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粤策,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一樟澜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦秩贰、人聲如沸霹俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丙唧。三九已至,卻和暖如春觅玻,著一層夾襖步出監(jiān)牢的瞬間想际,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工串塑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沼琉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓桩匪,卻偏偏與公主長得像打瘪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傻昙,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容