Archaius(Netflix 出品)專注動態配置管理:
DynamicPropertyFactory),@Value/Environment 注入的值不支持動態刷新,需重啟
[Consul KV 存儲] ←輪詢 60s→ [Archaius PolledConfigurationSource]
↓
[DynamicConfiguration + Scheduler]
↓
[ConfigurationManager 安裝]
↓
[DynamicPropertyFactory.getInstance().getStringProperty(key, default)]
↓
[業務代碼獲取最新值]
參考《第二十章 Spring Boot + Consul (1)》。
Key: service/{服務名}/{服務tag}/config
Value: application.properties 完整內容(多行 key=value)

<!-- Archaius 核心 -->
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.6.6</version>
</dependency>
<!-- 底層實現:Commons Configuration -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.8</version>
</dependency>
<!-- Consul Java 客戶端 -->
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>1.2.0</version>
</dependency>
public class ConsulConfigurationSource implements PolledConfigurationSource {
private final String keyName;
public ConsulConfigurationSource(String keyName) {
this.keyName = keyName;
}
@Override
public PollResult poll(boolean initial, Object checkPoint) throws Exception {
// 1. 連接 Consul
Consul consul = Consul.builder().build();
KeyValueClient kvClient = consul.keyValueClient();
// 2. 獲取配置字符串
Optional<String> kvOpt = kvClient.getValueAsString(keyName);
String kvStr = kvOpt.orElse("");
// 3. 字符串 → Properties
Properties props = new Properties();
props.load(new StringReader(kvStr));
// 4. Properties → Map
Map<String, Object> propMap = new HashMap<>();
for (Object key : props.keySet()) {
propMap.put((String) key, props.get(key));
}
// 5. 返回完整輪詢結果
return PollResult.createFull(propMap);
}
}
關鍵點:poll() 默認每 60 秒執行一次,實現動態感知。
@ApiOperation("從 Consul 通過 Archaius 動態獲取配置")
@RequestMapping(value = "/kv2/", method = RequestMethod.GET)
public void getKVByArchaius(@RequestParam("key") String key) throws IOException {
// 1. 構建配置源
PolledConfigurationSource source = new ConsulConfigurationSource(key);
// 2. 調度器(固定延遲輪詢)
AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler();
// 3. 動態配置對象
DynamicConfiguration configuration = new DynamicConfiguration(source, scheduler);
// 4. 註冊到配置管理器
ConfigurationManager.install(configuration);
// 5. 獲取動態屬性(帶默認值)
DynamicStringProperty dsp = DynamicPropertyFactory.getInstance()
.getStringProperty("mysql.driverClassName", "zhaojigangDriver");
// 6. 驗證動態性:打印 → 睡 60s → 再次打印
System.out.println("當前時間:" + LocalDateTime.now() + " → 值:" + dsp.get());
try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("當前時間:" + LocalDateTime.now() + " → 值:" + dsp.get());
// 若 Consul 中修改了該 key,第二次打印將顯示新值
}
| 類/接口 | 職責 |
|---|---|
| PolledConfigurationSource | 定義配置來源拉取邏輯 |
| AbstractPollingScheduler | 定義輪詢頻率策略 |
| DynamicConfiguration | 聚合 Source + Scheduler,實際 Property 容器 |
| ConfigurationManager | 全局配置註冊中心,install() 後生效 |
| DynamicPropertyFactory | 獲取動態屬性代理 |
| DynamicStringProperty | 字符串類型動態屬性,get() 總是返回最新值 |
@Value 注入,重啟生效更安全微服務配置管理核心:統一存儲 + 動態感知 + 安全降級。Archaius + Consul 輕量實現此目標,適合中小規模微服務體系。大規模場景建議遷移至 Spring Cloud Config / Nacos / Apollo。