代码写越少,bug越少;不写代码,才不会出bug
–> 返回Netflix OSS套件专栏汇总 <–
代码下载地址:https://github.com/f641385712/netflix-learning
前言
各位小伙伴大家好,我是A哥。从本系列开始,我们将一起进入Netflix Archaius的学习。Netflix Archaius
是一个配置管理库,其重点是来自多个配置存储的动态属性。它包括一组用于Netflix的Java配置管理API。它主要实现为Apache Commons Configuration
库的扩展。提供的主要功能有:
- 动态、类型属性
- 高吞吐量和线程安全的配置操作
- 一个轮询框架,允许用户获取对配置源的属性更改
- JMX支持
- 对于愿意使用基于约定的属性文件位置的应用程序(以及大多数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版本?
这个问题相信任何人都会有疑问,作为最新教程为毛不讲解最新版本而依旧使用老版本呢?这主要是从实用角度考虑的,原因列出如下:
- 相信直接使用Archaius,甚至是直接使用Netflix OSS组件的都极少,一般都是依托于Spring Cloud才会去使用,因此这才是主流
- 既然有主流我们也应该偏向于主流。截止目前,即使到了Spring Cloud的
2.2.1.RELEASE
版本,依赖的依旧是Archaius
的0.7.6
版本。所以站在实用的角度,讲解老版本才更具实际意义- 此版本对应的SB版本是:
2.2.2.RELEASE
;SC版本是:Hoxton.SR1
。发布时间是Nov, 2019
,非常新了吧
- 此版本对应的SB版本是:
- 需要说明的是: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.properties
被Archaius
自动识别了,自动完成绑定 - 若你需要动态改变某个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。也就是每分钟执行一次文件的重新读取动作
这几个参数配置项可参见URLConfigurationSource
和FixedDelayPollingScheduler
。
高级功能使用(待续)
下面介绍几个Archaius
的高级使用,也就是定制化使用的点。关于这部分本文只是提点,详细内容会分到后面文章详解。
自定义配置源或轮询调度程序
默认情况下,Archaius默认使用一组URL作为配置源,并以固定的延迟对其进行轮询。但是,您也可以提供自己的配置源和/或轮询调度程序。例如,您可以从关系数据库,分布式键值存储(如Cassandra)或第三方服务(如你自己的配置中心)定义自己的配置源。
- 自定义配置源:默认使用的
URLConfigurationSource
public class DBConfigurationSource implements PolledConfigurationSource {
// ...
@Override
public PollResult poll(boolean initial, Object checkPoint)
throws Exception {
// implement logic to retrieve properties from DB
}
}
- 自定义定时调度器:默认使用的是
FixedDelayPollingScheduler
public class MyScheduler extends AbstractPollingScheduler {
// ...
@Override
protected synchronized void schedule(Runnable runnable) {
// schedule the runnable
}
@Override
public void stop() {
// stop the scheduler
}
}
- 把以上自定义的组件放进
DynamicConfiguration
里:
PolledConfigurationSource source = ...
AbstractPollingScheduler scheduler = ...
DynamicConfiguration configuration = new DynamicConfiguration(source, scheduler);
- 安装进配置管理器:
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高工、架构师]系列纯纯纯技术群
- [享学Jackson] 一、初识Jackson – 世界上最好的JSON库
- [享学Jackson] 二、jackson-core之流式API与JsonFactory、JsonGenerator、JsonParser
- [享学Jackson] 三、jackson-databind之ObjectMapper与数据绑定、树模型
- [享学Jackson] 四、控制Jackson行为的特征们之JsonFactory.Feature、JsonGenerator.Feature、JsonParser.Feature
- [享学Jackson] 五、控制Jackson行为的特征们之JsonWriteFeature、JsonReadFeature
- [享学Jackson] 六、控制Jackson行为的特征们之MapperFeature、SerializationFeature、DeserializationFeature
- [享学Jackson] 七、Jackson使用bit位运算来开启/禁用Feature的原理解析
- [享学Jackson] 八、jackson-databind数据绑定基础配置之BaseSettings、MapperConfig、MapperConfigBase
- [享学Jackson] 九、jackson-databind数据绑定序列化/反序列化配置之SerializationConfig、DeserializationConfig
- [享学Jackson] 十、jackson-databind序列化之ObjectMapper序列化原理、序列化器匹配原理
- [享学Jackson] 十一、jackson-databind之JsonSerializer序列化器全解析
- [享学Jackson] 十二、jackson-databind反序列化之ObjectMapper反序列化原理、JsonDeserializer反序列化器全解析
- [享学Jackson] 十三、jackson-annotation注解模块全解析及Jackson注解大全
- [享学Jackson] 十四、深入理解Jackson的Module模块化设计及原理分析
- [享学Jackson] 十五、第三方模块Module的深度实践:JavaTimeModule、JSR310Module、ParameterNamesModule、Jdk8Module
- [享学Jackson] 十六、Jackson在Spring MVC中的使用之Date、JSR310时间类型的处理
- [享学Jackson] 十七、spring-web整合Jackson源码解析之Jackson2ObjectMapperBuilder
- [享学Jackson] 十八、Spring容器深度整合Jackson的桥梁之SpringHandlerInstantiator
- [享学Jackson] 十九、Spring下使用ObjectMapper的正确姿势 — Jackson2ObjectMapperFactoryBean
- [享学Jackson] 二十、Spring MVC下的Jackson — MappingJackson2HttpMessageConverter
- [享学Jackson] 二十一、Spring Boot下的Jackson — JacksonAutoConfiguration自动配置
- [享学Jackson] 二十二、Jackson与Fastjson的恩怨情仇(完结篇)
转载:https://blog.csdn.net/f641385712/article/details/105549518