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 的核心任务是:

  1. 将 Spring 的 ConfigurableEnvironment 中所有属性源,包装成 ConcurrentCompositeConfiguration
  2. 通过 ConfigurationManager 安装该组合配置

配置源的优先级顺序如下(从高到低):

  1. Spring 容器中定义的 AbstractConfiguration Bean
  2. Spring @AutowiredConfigurableEnvironment 中的源
  3. Archaius 默认源(如 config.properties
  4. 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.ymlconfig.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


原始标题:Introduction to Netflix Archaius with Spring Cloud