archaius简介

archaius是netflix开源的动态属性配置框架,基于apache commons configuration, 提供在运行时获取配置值的功能。

如何使用

通过archaius获取配置值,有两种方式:

一种是通过ConfigurationManager获取到配置中心实例,然后通过propName获取配置值。

通过ConfigurationManager获取配置

另外一种方式是通过DynamicPropertyFactory,获取配置项的DynamicProperty wrapper。

通过DynamicPropertyFactory获取配置

然后通过wrapper获取配置值

然后通过wrapper获取配置值

archaius做了什么?

不管是使用ConfigurationManager还是DynamicPropertyFactory获取配置值,都是通过apache common configuration的AbstractConfiguration的实现类获取的。

archaius提供了AbstractConfiguration的具体实现。

archaius类关系

ConcurrentMapConfiguration提供将配置项配置值放在ConcurrentHashMap中维护的功能。

ConcurrentMapConfiguration

DynamicConfiguration提供动态从数据源获取所有配置值的功能,通过轮询数据源更新配置值。

DynamicConfiguration

DynamicWatchedConfiguration也是提供动态更新配置的功能,与DynamicConfiguration不同的是,配置更新是数据源有变化时触发的。

DynamicConfiguration是pull方式,DynamicWatchedConfiguration是push方式。

DynamicWatchedConfiguration
DynamicWatchedConfiguration

ConcurrentCompositeConfiguration使用了组合模式,组合不同的AbstractConfiguration实现。对于有多个配置源的配置中心,可以使用ConcurrentCompositeConfiguration。对于同一个配置项,多个配置源都有配置值的时候,取第一个匹配到的配置源的数据。

ConcurrentCompositeConfiguration


DynamicPropertyFactory是怎么运行的?

DynamicPropertyFactory持有AbstractConfiguration实例。

创建DynamicProperty对象时,DynamicProperty对象会获取DynamicPropertyFactory持有的AbstractConfiguration实例。

DynamicProperty对象会向AbstractConfiguration实例注册DynamicPropertyListener, 当AbstractConfiguration有增删改查变化时,会通知到当前的DynamicProperty对象。

当创建的DynamicProperty实例数量比较大的时候,这里可能有性能问题。每创建一个任何一个DynamicProperty,都会增加一个listener,同时,任何一个配置项发生变化,都会触发listener。

可能是考虑到生产环境中不会有那么多的配置项变更吧。像zk-config那种对应配置项变更才触发watcher要好一点。

AbstractConfiguration是怎么注入的?

archaius仅允许一个AbstractConfiguration的实现类。如果有多个配置源,可以使用上面提到的ConcurrentCompositeConfiguration将不同的AbstractConfiguration组合起来。

有以下几种方式注入AbstractConfiguration。

1  配置archaius.default.configuration.class 指定AbstractConfiguration实现类

2  配置 archaius.default.configuration.factory 指定AbstractConfiguration实例工厂方法类,工厂方法类需要实现getInstance方法返回AbstractConfiguration实例

3 调用 ConfigurationManager 的 install(AbstractConfiguration config)  方法

4 调用DynamicPropertyFactory 的 initWithConfigurationSource(AbstractConfiguration config) 方法

以上方法是互斥的,只能使用其中的一种,一种生效后,其他的就不能调用了。

你可能感兴趣的:(archaius简介)