- 属性的最终值取决于包含该属性的最顶层配置(因为是复合配置)。即,如果一个属性存在于多个配置中,则应用程序看到的实际值将是配置层次结构中最顶层插槽中的值,当然这种层次结构是可以配置的。
Archaius的架构设计
Archaius实际上是对Apache Common Configuration Library的一个封装和扩展,提供了一组基于Java的配置API,主要的特性包括:
-
配置可动态调整:动态、类型属性
-
配置支持类型(Int, Long, Boolean等)。
-
高性能和线程安全:高吞吐量和线程安全的配置操作
-
提供一个拉(pulling)配置的框架,可以从配置源动态拉取变更的配置。(一个轮询框架,允许用户获取对配置源的属性更改)
-
支持回调(callback)机制,在配置变更时自动调用。
-
支持JMX MBean,可以通过JConsole查看配置和修改配置。
对于愿意使用基于约定的属性文件位置的应用程序(以及大多数web应用程序),提供开箱即用的复合配置(这是强大功能之一),对于符合配置官网给了一副示例图如下:
Achaius的核心是一个称为**组合配置(Composite Configuration)**的概念,简单可以理解为一个分层级的配置,层级有优先级,高优先级的层级的配置会覆盖低优先级的配置。每一个层级可以从某个配置源获取配置,例如本地配置文件,JDBC数据源,远程REST API等。配置源还可以在运行时动态拉取变更,例如在上图中,持久化数据库配置(Persisted DB Configuration)是指将配置存在关系数据库中,相应的配置源会定期从数据库拉取变更)。配置的最终值由顶级配置决定,例如,如果多个层级都含有某个配置项,那么应用最终见到的值是配置层级中最顶层的值。配置分层的顺序是可以调整的。
通过archaius获取配置值,有两种方式:
- 一种是通过ConfigurationManager获取到配置中心实例,然后通过propName获取配置值,通过ConfigurationManager获取配置
- 另外一种方式是通过DynamicPropertyFactory,获取配置项的DynamicProperty wrapper。
Archaius的实现原理
Archaius是什么?
Archaius提供了动态修改配置的值的功能,在修改配置后,不需要重启应用服务。其核心思想就是轮询配置源,每一次迭代,检测配置是否更改,有更改重新更新配置。
底层archaius提供实现了Apache-common-configuration的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。
-
配置archaius.default.configuration.class 指定AbstractConfiguration实现类
-
配置 archaius.default.configuration.factory 指定AbstractConfiguration实例工厂方法类,工厂方法类需要实现getInstance方法返回AbstractConfiguration实例
-
调用 ConfigurationManager 的 install(AbstractConfiguration config) 方法
-
调用DynamicPropertyFactory 的 initWithConfigurationSource(AbstractConfiguration config) 方法
以上方法是互斥的,只能使用其中的一种,一种生效后,其他的就不能调用了。
一个简单的例子:
Maven依赖配置
com.netflix.archaius
archaius-core
0.7.7
获取配置源
/**
- Created by longfei on 17/1/19.
*/
public class DynamicConfigurationSource implements PolledConfigurationSource {
@Override
public PollResult poll(boolean initial,Object checkPoint) throws Exception {
Map<String,Object> map = new HashMap<>();
map.put(“test”,UUID.randomUUID().toString());
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://i-blog.csdnimg.cn/blog_migrate/8ee09146a020f4adba08b30c7e94a209.jpeg)
最后
学习视频:
大厂面试真题:
如果你觉得这些内容对你有帮助,可以扫码领取!**
![img](https://i-blog.csdnimg.cn/blog_migrate/8ee09146a020f4adba08b30c7e94a209.jpeg)
最后
学习视频:
[外链图片转存中…(img-CAMnOjtT-1711479085535)]
大厂面试真题:
[外链图片转存中…(img-IIqQlWrP-1711479085535)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!