1. 概述
Netflix Archaius 是一个功能强大的配置管理库。
简单粗暴地说,它是一个可以从多种数据源加载配置属性的框架,并提供快速、线程安全的访问能力。✅
更关键的是,它支持运行时动态更新配置,系统无需重启即可感知变更 —— 这在微服务场景下简直是刚需。
本文将带你从零搭建一个 Spring Cloud 集成 Archaius 的示例,剖析其工作原理,并展示如何扩展其默认行为。目标是让你在项目中能真正用起来,而不是只停留在“听说过”。
2. Archaius 的核心特性
Spring Boot 本身已经提供了完善的 外部化配置 机制,那为啥还要引入 Archaius?
因为 Archaius 提供了一些 Spring 原生机制不具备的高级能力,尤其适合对配置动态性要求极高的场景。以下是它最亮眼的几个特性:
- ✅ 动态 + 强类型属性:支持 String、Integer、Boolean 等类型,并能监听变更
- ✅ 变更回调机制:属性更新时可触发自定义逻辑(比如刷新缓存)
- ✅ 开箱即用的动态源实现:支持从 URL、JDBC、DynamoDB 等动态拉取配置
- ✅ JMX MBean 支持:可通过 Spring Boot Actuator 或 JConsole 实时查看/修改配置
- ✅ 动态属性校验:支持对变更后的值做合法性校验
这些能力组合起来,特别适合构建高可用、高动态性的分布式系统。
Spring Cloud 提供了 spring-cloud-starter-netflix-archaius
,它自动桥接了 Spring 的 Environment
和 Archaius 的配置体系,让你可以无缝使用 Archaius 的 API。
3. 依赖配置
在 pom.xml
中引入 starter 即可:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>2.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
⚠️ 建议去 Maven Central 确认最新版本,避免踩坑版本兼容性问题。
4. 基本使用
引入依赖后,你就可以直接使用 Archaius 的 API 获取动态属性了:
DynamicStringProperty dynamicProperty
= DynamicPropertyFactory.getInstance()
.getStringProperty("baeldung.archaius.property", "default value");
String propertyCurrentValue = dynamicProperty.get();
下面通过一个简单例子验证效果。
4.1. 快速示例
默认情况下,Archaius 会自动加载 classpath 下名为 config.properties
的文件,并支持热更新。
在 src/main/resources
下创建该文件:
#config.properties
baeldung.archaius.properties.one=one FROM:config.properties
然后写一个 REST 接口暴露该属性值:
@RestController
public class ConfigPropertiesController {
private DynamicStringProperty propertyOneWithDynamic
= DynamicPropertyFactory.getInstance()
.getStringProperty("baeldung.archaius.properties.one", "not found!");
@GetMapping("/property-from-dynamic-management")
public String getPropertyValue() {
return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get();
}
}
启动应用,访问 /property-from-dynamic-management
,返回:
baeldung.archaius.properties.one: one FROM:config.properties
现在不重启服务,直接修改 config.properties
中的值,比如改为:
baeldung.archaius.properties.one=UPDATED VALUE!
等待约 1 分钟(默认轮询间隔),再次访问接口,你会发现值已经更新!✅
这就是 Archaius 的动态能力 —— 无需重启,配置生效。
5. 工作原理剖析
5.1. Archaius 核心机制
Archaius 本质是 Apache Commons Configuration 的增强版,主要增加了:
- 支持轮询机制的动态配置源
- 高吞吐、线程安全的属性访问
它的核心是 CompositeConfiguration
,将多个配置源组合成一个逻辑整体。这些源有优先级顺序,同名属性以高优先级源的值为准。
ConfigurationManager
负责全局配置的安装与管理。
5.2. Spring Cloud 的整合逻辑
spring-cloud-netflix-archaius
的核心任务是:
- 将 Spring 的
ConfigurableEnvironment
中所有属性源,包装成ConcurrentCompositeConfiguration
- 通过
ConfigurationManager
安装该组合配置
配置源的优先级顺序如下(从高到低):
- Spring 容器中定义的
AbstractConfiguration
Bean - Spring
@Autowired
的ConfigurableEnvironment
中的源 - Archaius 默认源(如
config.properties
) - JDK 系统属性(
SystemConfiguration
)和环境变量(EnvironmentConfiguration
)
此外,该模块还自动注册了一个 Actuator 接口(Endpoint),可用于监控和修改配置,具体使用不在本文展开。
6. 自定义与扩展配置
了解原理后,我们可以灵活定制 Archaius 的行为。
6.1. Archaius 支持的配置属性
你可以通过 JVM 参数或配置文件调整 Archaius 的默认行为:
-Darchaius.configurationSource.additionalUrls="classpath:other-dir/extra.properties,file:///home/user/other-extra.properties"
这会让 Archaius 加载额外的配置文件,且后加载的文件优先级更高。
其他常用配置项:
属性名 | 说明 |
---|---|
archaius.configurationSource.defaultFileName |
默认配置文件名,默认 config.properties |
archaius.fixedDelayPollingScheduler.initialDelayMills |
首次加载延迟(毫秒) |
archaius.fixedDelayPollingScheduler.delayMills |
轮询间隔,默认 60000(1分钟) |
6.2. 通过 Spring 添加自定义配置源
如果你想添加一个优先级高于 Spring Environment 的动态配置源,只需在 Spring 容器中注册一个 AbstractConfiguration
Bean:
@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL();
PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL);
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}
这样,other-config.properties
中的配置将覆盖 Spring Boot 的 application.yml
和 config.properties
中的同名属性。
Archaius 内置了多种 PolledConfigurationSource
实现(如 JDBC、URL、ZooKeeper),可以轻松接入外部存储。
7. 总结
Archaius 提供了比 Spring 原生配置更强大的动态管理能力,尤其适合需要实时变更配置的场景。
通过 Spring Cloud 的自动装配,我们可以无缝集成 Archaius,并利用其优先级机制灵活控制配置来源。
文中所有示例代码均可在我们的 GitHub 仓库找到:
👉 https://github.com/baeldung/spring-cloud-tutorials/tree/master/spring-cloud-archaius