小言_互联网的博客

[享学Archaius] 一、初识Archaius的简单使用及高级使用

327人阅读  评论(0)

代码写越少,bug越少;不写代码,才不会出bug

–> 返回Netflix OSS套件专栏汇总 <–
代码下载地址:https://github.com/f641385712/netflix-learning

前言

各位小伙伴大家好,我是A哥。从本系列开始,我们将一起进入Netflix Archaius的学习。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版本,依赖的依旧是Archaius0.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 = YoutBatman
my.age = 22

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

my.name = YoutBatman
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打好坚实基础。

声明

本号所有“享学xxx”系列文章/视频,和什么“享学课堂”、“享学科技”无任何关系。只因笔者名字和其重名,仅此而已

  • 原创不易,码字更不易,你的【三连】是对A哥的最大支持
  • 关注我吧:一个前25年还不会写Hallo World的半残程序猿,人送外号:A哥
    • 公众号:BAT的乌托邦(ID:BAT-utopia)
    • CSDN:BAT的乌托邦
    • 掘金:BAT的乌托邦
    • 腾讯云+社区:BAT的乌托邦
    • 知识星球:BAT的乌托邦
    • 扫码/加我wx:fsx641385712,邀你加入[Java高工、架构师]系列纯纯纯技术群



转载:https://blog.csdn.net/f641385712/article/details/105549518
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场