初识Archaius的简单使用及高级使用-01

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Archaius的简单使用及高级使用-01相关的知识,希望对你有一定的参考价值。

初识Archaius的简单使用及高级使用-01


前言

Netflix Archaius是一个配置管理库,其重点是来自多个配置存储的动态属性。它包括一组用于Netflix的Java配置管理API。它主要实现为Apache Commons Configuration库的扩展。提供的主要功能有:

  1. 动态、类型属性
  2. 高吞吐量和线程安全的配置操作
  3. 一个轮询框架,允许用户获取对配置源的属性更改
  4. JMX支持
  5. 对于愿意使用基于约定的属性文件位置的应用程序(以及大多数web应用程序),提供开箱即用的复合配置(这是强大功能之一),对于符合配置官网给了一副示例图如下:


版本约定

本系列所有内容均是基于Archaius1.x进行讲解的(确切的说应该是0.x),并且使用的版本约定为0.7.7

<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-core</artifactId>
    <version>0.7.7</version>
</dependency>

为何选择已经停更的1.x版本?

这个问题相信任何人都会有疑问,作为最新教程为毛不讲解最新版本而依旧使用老版本呢?这主要是从实用角度考虑的,原因列出如下:

  1. 相信直接使用Archaius,甚至是直接使用Netflix OSS组件的都极少,一般都是依托于Spring Cloud才会去使用,因此这才是主流

  2. 既然有主流我们也应该偏向于主流。截止目前,即使到了Spring Cloud的2.2.1.RELEASE版本,依赖的依旧是Archaius的0.7.6版本。所以站在实用的角度,讲解老版本才更具实际意义

    1. 此版本对应的SB版本是: 2.2.2.RELEASE;SC版本是:Hoxton.SR1。发布时间是Nov, 2019,非常新了吧

  3. 需要说明的是:0.77和0.76版本近乎无差异,可同等看待。而0.77作为1.x的final最后一版本,因此我就定它喽


正文

Archaius核心是可以容纳一个或多个配置的复合配置的概念。每个配置都可以从诸如JDBC、REST接口、xxx.properties文件等配置源中获取。可以选择在运行时对配置源进行轮询以进行动态更改(在上图中,为持久化数据库配置源;在表中包含属性的RDBMS,每隔一段时间就会被轮询一次以进行更改)。

属性的最终值取决于包含该属性的最顶层配置(因为是复合配置)。即,如果一个属性存在于多个配置中,则应用程序看到的实际值将是配置层次结构中最顶层插槽中的值,当然这种层次结构是可以配置的。


基本使用

使用本地文件作为配置源

通过使用本地配置文件向应用程序提供动态属性,有两种方法可以使Archaius开箱即用:

  • 默认情况下,Archaius将在应用程序的类路径中查找名为config.properties 的文件,并读取其内容作为配置属性。该文件也可以位于jar文件的根目录中

  • 配置文件名必须叫config.properties才能被自动识别读取哦,约定大于配置

  • 除了约定值,您可以定义系统属性archaius.configurationSource.additionalUrls来指定你的文件所在位置,其中包含本地配置文件的URL路径。例如,将此添加到您的应用程序增加启动参数:

-Darchaius.configurationSource.additionalUrls=file:///apps/myapp/application.properties

代码示例
@Test
public void fun1() throws InterruptedException 
    DynamicIntProperty myAge = DynamicPropertyFactory.getInstance().getIntProperty("my.age", 18);
    System.out.println(myAge);
    System.out.println(myAge.get());

    TimeUnit.SECONDS.sleep(80);
    System.out.println("动态修改后的值为:");
    System.out.println(myAge);
    System.out.println(myAge.get());

在classpath下新建一个配置文件,命名为config.properties

my.name = DHY
my.age = 22

运行程序,在输出第一句时立马改动配置文件内容为(务必记得重新编译,否则没有效果):

my.name = XPY
my.age = 100

最后控制台输出为:

DynamicProperty: name=my.age, current value=22
22
动态修改后的值为:
DynamicProperty: name=my.age, current value=100
100

上面的代码中有几点需要注意:

  • my.age是绑定到long值的属性。无需任何代码即可将字符串解析为long(无需你自己手动强转喽)

  • 你的配置文件config.propertiesArchaius自动识别了,自动完成绑定

  • 若你需要动态改变某个key的值,只需编辑配置文件并更改属性的值即可。默认情况下,Archaius将每分钟读取一次文件,并且此更改将在一分钟之内在您的应用程序中生效

    • 提示:如果你的config.properties是打包在工程内的话,必须重新编译。如果是外部化配置,则无需操作。

使用多个URL作为配置源

除了类路径上的默认config.properties文件之外,您还可以为系统属性archaius.configurationSource.additionalUrls定义多个以逗号,分隔的URL。Archaius将首先读取config.properties,然后按定义的顺序读取系统属性中定义的所有其他URL。如果有两个包含相同属性的URL,则最终值将来自稍后读取的URL(也就是后放的值覆盖先放的值)。


示例代码
public static void main(String[] args) throws InterruptedException 
	// 请注意:这里必须是file:\\\\打头  而不能直接写D:\\\\
	// 很多小伙伴说可以这么写:
	// -Darchaius.configurationSource.additionalUrls="file:\\\\D:\\\\workspaces-mine\\\\learning\\\\netflix-learning\\\\mydemo.properties"
	// 自测无效。请参照源码:只支持System属性,而非程序参数 
    System.setProperty("archaius.configurationSource.additionalUrls",
            "file:\\\\D:\\\\workspaces-mine\\\\learning\\\\netflix-learning\\\\mydemo.properties");

    DynamicIntProperty myAge = DynamicPropertyFactory.getInstance().getIntProperty("my.age", 18);
    System.out.println(myAge);
    System.out.println(myAge.get());

mydemo.properties的内容如下:

my.age=9000

可以看到additionalUrls的值会覆盖调用主配置config.properties里的值的。

说明:该配置写在config.properties里也是无效的,只能放在系统属性里

如果您的应用程序在集群中运行,则该用例特别有用。通过将其他配置URL定义为集中式HTTP URL,可以避免在集群的每个服务器上更改相同配置文件的麻烦。


更改默认设置

其实Archaius的默认配置并不在少数,可以说具体配置项“藏在”源码处的各个角落,这里流出几个主要的默认配置项:

  • archaius.configurationSource.defaultFileName:表示默认加载的配置文件名称,默认值是config.properties 。该配置类也被称为主配置

  • 小细节:文件名并不强制要求是.properties结尾,只要是k-v结构就行

  • archaius.fixedDelayPollingScheduler.initialDelayMills:从配置源读取的初始延迟(以毫秒为单位),默认值30000。也就是任务启动后果30s首次执行重新读取动作

  • archaius.fixedDelayPollingScheduler.delayMills:固定两次读取配置URL之间的延迟(以毫秒为单位),默认值60000。也就是每分钟执行一次文件的重新读取动作

这几个参数配置项可参见URLConfigurationSourceFixedDelayPollingScheduler


高级功能使用(待续)

下面介绍几个Archaius的高级使用,也就是定制化使用的点。关于这部分本文只是提点,详细内容会分到后面文章详解。


自定义配置源或轮询调度程序

默认情况下,Archaius默认使用一组URL作为配置源,并以固定的延迟对其进行轮询。但是,您也可以提供自己的配置源和/或轮询调度程序。例如,您可以从关系数据库,分布式键值存储(如Cassandra)或第三方服务(如你自己的 配置中心)定义自己的配置源。

  1. 自定义配置源:默认使用的URLConfigurationSource
public class DBConfigurationSource implements PolledConfigurationSource 
    // ...
    @Override
    public PollResult poll(boolean initial, Object checkPoint)
            throws Exception 
        // implement logic to retrieve properties from DB
      

  1. 自定义定时调度器:默认使用的是FixedDelayPollingScheduler
public class MyScheduler extends AbstractPollingScheduler 
    // ...
    @Override
    protected synchronized void schedule(Runnable runnable) 
        // schedule the runnable
    

    @Override
    public void stop() 
        // stop the scheduler
    

  1. 把以上自定义的组件放进DynamicConfiguration里:
PolledConfigurationSource source = ...
AbstractPollingScheduler scheduler = ...
DynamicConfiguration configuration = new DynamicConfiguration(source, scheduler);
  1. 安装进配置管理器:
ConfigurationManager.install(configuration);

这样就可以使用了,形如这样:

DynamicStringProperty myprop = DynamicPropertyFactory.getInstance().getStringProperty(...);

使用JConsole在运行时查看和更新属性

默认情况下Archaius的JMX功能是关闭的,需要显示打开才能使用。增加如下配置项:

archaius.dynamicPropertyFactory.registerConfigWithJMX=true

向DynamicPropertyFactory注册的配置将自动提供给JMX,您可以在其中通过jconsole更新属性,略。


使用ConfigurationManager配置管理器

配置管理器是管理系统范围的配置和部署上下文的中心位置。如果您使用自己的AbstractConfiguration进行配置管理,则可以使用ConfigurationManager进行安装,该管理器负责使用AbstractConfiguration初始化DynamicPropertyFactory。如果您的应用程序没有以编程方式安装任何配置,则将懒惰地安装包含系统属性和DynamicURLConfiguration的ConcurrentCompositeConfiguration。

部署上下文包含与应用程序部署相关的属性。例如,DeploymentContext.getDeploymentEnvironment()可以返回诸如“ test”,“ dev”,“ prod”之类的字符串。这对于确定特定部署上下文中使用的属性集很有用。如果没有使用ConfigurationManager以编程方式设置部署上下文,则将安装默认的ConfigurationBasedDeploymentContext。ConfigurationBasedDeploymentContext中API的返回值基于一组属性值,这些属性值是从随ConfigurationManager一起安装的配置中获得的。


将Archaius与你自己的Apache Commons Configuration实现一起使用

我们已经知道Archaius它底层是依赖于Apache Commons Configuration来做配置管理的,那么如果你已经有了自己的一套Apache Commons Configuration实现了怎么办呢?这个时候就需要整合喽

如果您已经使用或扩展了Apache Commons Configuration中的任何类型的AbstractConfiguration,但是想要利用Archaius来为应用程序提供动态属性,则可以使用ConfigurationManager通过两种方式来实现:

  • 使用的实现com.netflix.config.AbstractPollingScheduler来轮询动态配置源并将其放入您自己的配置中,伪代码如下:
AbstractConfiguration myConfiguration =  ... ; //这是您的原始配置
// // ... 
AbstractPollingScheduler scheduler =  new  FixedDelayPollingScheduler(); //或使用您自己的调度程序
PolledConfigurationSource source =  new  URLConfigurationSource(); //或使用您自己的源 
scheduler.setIgnoreDeletesFromSource(true; //不要将源中缺少的属性视为删除 
scheduler.startPolling(source,myConfiguration);
// ... 
ConfigurationManager.install(myConfiguration);

现在,原始配置在运行时变为动态,因为轮询的配置源中的属性将覆盖原始配置中的值。

  • 使用com.netflix.config.ConcurrentCompositeConfiguration把你的配置组合进来。伪代码如下:
AbstractConfiguration myConfiguration = ...; // this is your original configuration

// create the dynamic configuration
AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(); // or use your own scheduler
PolledConfigurationSource source = new URLConfigurationSource(); // or use your own source
DynamicConfiguration dynamicConfig = new DynamicConfiguration(source, scheduler);
    
ConcurrentCompositeConfiguration finalConfig = new ConcurrentCompositeConfiguration();
// add them in this order to make dynamicConfig override myConfiguration
finalConfig.addConfiguration(dynamicConfig);
finalConfig.addConfiguration(myConfiguration);

ConfigurationManager.install(finalConfig);

我个人觉得这么做是推荐的做法。


总结

初识Archaius的简单使用和高级使用就先介绍到这,通过本文已经了解到了Archaius的作用,以及大概它能怎么玩,那么接下来将带您一起走入它的深入理解之路。

在深入理解Archaius过程中,有一个绕不开的“障碍”便是Apache Commons Configuration,由于前者强依赖于后者进行配置管理。正所谓你对Apache Commons Configuration有多了解,决定了你对Netflix Archaius的认识有多深,因此接下来的几篇内容我将聚焦在Apache Commons Configuration的使用以及深入理解上,一方面能全面的去理解配置管理技术,另一方面能为更好的认识Archaius打好坚实基础。

以上是关于初识Archaius的简单使用及高级使用-01的主要内容,如果未能解决你的问题,请参考以下文章

编程语言的分类及初识大蟒蛇

Archaius是什么?

初识Redis系列之二:安装及简单使用

Python基础二:pycharm的安装及简单使用,while循环,格式化输出,运算符, 编码的初识,git

archaius简介

使用 Spring-Cloud-Config 而不是 Archaius 的 Hystrix 运行时配置?