首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring Boot + Archaius + Consul 實現動態配置管理最佳實踐

     編輯:Java 綜合教學

一、Archaius 核心價值

Archaius(Netflix 出品)專注動態配置管理:

  • 輪詢機制:默認每 60 秒從配置源拉取,修改配置無需重啟服務即時生效
  • 線程安全:配置讀取/更新全過程線程安全
  • 核心前提:必須使用 Archaius API 讀取(DynamicPropertyFactory),@Value/Environment 注入的值不支持動態刷新,需重啟

二、架構圖解

[Consul KV 存儲] ←輪詢 60s→ [Archaius PolledConfigurationSource] 
                                          ↓
                              [DynamicConfiguration + Scheduler]
                                          ↓
                              [ConfigurationManager 安裝]
                                          ↓
                    [DynamicPropertyFactory.getInstance().getStringProperty(key, default)]
                                          ↓
                              [業務代碼獲取最新值]

三、前置條件:Consul 啟動與 KV 創建

參考《第二十章 Spring Boot + Consul (1)》。

KV Key 規範

Key:   service/{服務名}/{服務tag}/config
Value: application.properties 完整內容(多行 key=value)

Consul KV 示例

四、Maven 依賴

<!-- 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>

五、核心代碼實現

1. 自定義配置源

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 秒執行一次,實現動態感知。

2. Controller 動態讀取示例

@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() 總是返回最新值

七、生產環境建議

  • 配置分層:頻繁變動的業務參數用 Archaius API;基礎設施參數(數據源、端口)用 @Value 注入,重啟生效更安全
  • 降級策略:Consul 不可用時,Archaius 保持舊值不拋異常,保證服務可用性
  • 監控告警:監控輪詢失敗次數、配置變更頻率,異常報警
  • 權限控制:Consul ACL 限制服務只能讀取自身配置 Key

微服務配置管理核心:統一存儲 + 動態感知 + 安全降級。Archaius + Consul 輕量實現此目標,適合中小規模微服務體系。大規模場景建議遷移至 Spring Cloud Config / Nacos / Apollo。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved