archaius是netflix开源的动态属性配置框架,基于apache commons configuration, 提供在运行时获取配置值的功能。
如何使用
通过archaius获取配置值,有两种方式:
一种是通过ConfigurationManager获取到配置中心实例,然后通过propName获取配置值。
另外一种方式是通过DynamicPropertyFactory,获取配置项的DynamicProperty wrapper。
然后通过wrapper获取配置值
archaius做了什么?
不管是使用ConfigurationManager还是DynamicPropertyFactory获取配置值,都是通过apache common configuration的AbstractConfiguration的实现类获取的。
archaius提供了AbstractConfiguration的具体实现。
ConcurrentMapConfiguration提供将配置项配置值放在ConcurrentHashMap中维护的功能。
DynamicConfiguration提供动态从数据源获取所有配置值的功能,通过轮询数据源更新配置值。
DynamicWatchedConfiguration也是提供动态更新配置的功能,与DynamicConfiguration不同的是,配置更新是数据源有变化时触发的。
DynamicConfiguration是pull方式,DynamicWatchedConfiguration是push方式。
ConcurrentCompositeConfiguration使用了组合模式,组合不同的AbstractConfiguration实现。对于有多个配置源的配置中心,可以使用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) 方法
以上方法是互斥的,只能使用其中的一种,一种生效后,其他的就不能调用了。