一文读懂SpringCloud的配置管理框架Archaius

2,346 阅读3分钟

一、Archaius是什么?

Archaius是一个提供获取可以运行时动态改变的属性的API的Java类库

二、Archaius特性

1、动态属性

  1. 可以使用简洁的代码去动态获取类型特定的属性
  2. 可以对某个属性发生修改之后创建callback
DynamicIntProperty prop = 
      DynamicPropertyFactory.getInstance().getIntProperty("myProperty", DEFAULT_VALUE);
// prop.get() may change value at runtime
myMethod(prop.get());

// 创建callback
prop.addCallback(new Runnable() {
  public void run() {
      // ...
  }
});

2、循环读取配置源数据信息

  1. DynamicPropertyFactory将会按照一定的间隔(默认1分钟)取获取类路径下或者通过参数指定的url的配置,实现动态更新
  2. 我们可以自己实现相关的接口来自定义自己的数据源、定时加载更新逻辑等
PolledConfigurationSource source = createMyOwnSource();
AbstractPollingScheduler scheduler = createMyOwnScheduler();
ConfigurationManager.install(new DynamicConfiguration(source, scheduler));

3、完成对部分配置源的实现

  1. 完成JDBC、DynamoDB、zk等数据源的实现,开箱即用
  2. 可以自定义自己的配置源,参考:github.com/Netflix/arc…

4、配置和发布上下文管理

  1. com.netflix.config.ConfigurationManager是用来管理全系统配置的管理器
  2. 它是archaius的核心处理类,后面的自定义配置源加载也需要经过这个类

5、高吞吐且线程安全的获取配置

6、支持scala

三、简易混合配置架构

  1. archaius核心概念是混合配置,能够维护一到多个配置源,诸如JDBC、REST、本地配置、zk、容器配置等
  2. 当某个配置在多个配置源中都存在时,那么最终生效的配置优先级取决于下图的层级顺序;比如你在数据库中配置了属性A(value=1),config.properties中也配置属性A(value=2),那么从下图的层级关系看,最终生效的是value=1的配置

image

四、使用Archaius配置

1、引入依赖

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

2、使用本地文件作为配置源

  1. 默认archaius可以会使用类路径下的config.properties文件作为配置源
  2. 当然jar中的config.properties也会作为配置源,不过这个优先级比当前工程类路径的低
  3. 我们可以在类路径下配置config.properties,通过5中的获取配置方式来动态获取配置

3、使用外部的URLS作为配置源

可以使用如下配置来指定配置源,他的优先级高于config.properties

-Darchaius.configurationSource.additionalUrls=http://myserver/properties

4、archaius的默认配置参数

  1. archaius.configurationSource.defaultFileName,默认值config.properties;表示本地配置文件名
  2. archaius.fixedDelayPollingScheduler.initialDelayMills,默认30000;表示初始化时拉取配置的延迟时间
  3. archaius.fixedDelayPollingScheduler.delayMills。默认60000;表示定时拉取配置的间隔时间
  4. 可以通过系统参数对这三个参数进行重置

5、使用配置

// 推荐使用这种方式获取属性
System.out.println(DynamicPropertyFactory.getInstance()
                .getStringProperty("test.archaius", "fail").get());

System.out.println(DynamicProperty.getInstance("test.archaius").getString());

6、配置管理器的总结

  1. ConfigurationManager时archaius用来管理所有配置的管理器,包括管理系统、dynamicUrl、环境、自定的配置源(例如zk、db等)等的配置
  2. ConfigurationManager是通过实例化一个CompositionConfiguration来进行管理的
  3. 我们可以通过ConfigurationManager.getConfigInstance()获取一个系统全局的配置,包含了所有层级的配置数据
  4. 具体源码就不做分析