全部產品
Search
文件中心

Application Configuration Management(Deprecated):ACM Java Native SDK 概述

更新時間:Jul 06, 2024

您可以使用 ACM Java Native SDK 來擷取、監聽、發布和刪除配置。

添加依賴

pom.xml 檔案中添加以下依賴,即可開始使用 ACM Java Native SDK。

<dependency>
    <groupId>com.alibaba.edas.acm</groupId>
    <artifactId>acm-sdk</artifactId>
    <version>1.0.9</version>
</dependency>
<!--  如果已有日誌實現,則可去除以下依賴  -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>
重要 如需使用以 KMS AES-128 方式加密的配置,則依賴的 acm-sdk 版本不可低於 1.0.9。

範例程式碼

添加依賴後,即可在程式中使用 ACM Java Native SDK 提供的介面。

說明 請將代碼中的 $regionId$endpoint$namespace$accessKey$secretKey 分別替換為 ACM 控制台上命名空間詳情對話方塊內的地區 IDEnd Point命名空間 IDAccessKeySecretKey
import java.util.Properties;
import com.alibaba.edas.acm.ConfigService;
import com.alibaba.edas.acm.exception.ConfigException;
import com.alibaba.edas.acm.listener.ConfigChangeListener;
import com.alibaba.edas.acm.listener.PropertiesListener;
// 範例程式碼,僅用於樣本測試
public class ACMTest {
    // 屬性/開關
    private static String config = "DefaultValue";
    private static Properties acmProperties = new Properties();
    public static void main(String[] args) {
        try {
            // 從控制台命名空間管理中拷貝對應值
            Properties properties = new Properties();
            properties.put("endpoint", "$endpoint");
            properties.put("namespace", "$namespace");
            // 通過 ECS 執行個體 RAM 角色訪問 ACM
            // properties.put("ramRoleName", "$ramRoleName");
            properties.put("accessKey", "$accessKey");
            properties.put("secretKey", "$secretKey");
            // 如果是加密配置,則添加下面兩行進行自動解密
            //properties.put("openKMSFilter", true);
            //properties.put("regionId", "$regionId");
            ConfigService.init(properties);
            // 主動擷取配置
            String content = ConfigService.getConfig("${dataId}", "${group}", 6000);
            System.out.println(content);
            // 初始化的時候,給配置添加監聽,配置變更會回調通知
            ConfigService.addListener("${dataId}", "${group}", new ConfigChangeListener() {
                public void receiveConfigInfo(String configInfo) {
                    // 當配置更新後,通過該回呼函數將最新值返回給使用者。
                    // 注意回呼函數中不要做阻塞操作,否則阻塞通知線程。
                    config = configInfo;
                    System.out.println(configInfo);
                }
            });
            /**
             * 如果配置值的內容為properties格式(key=value),可使用下面監聽器。以便一個組態管理多個配置項
             */
            /**
            ConfigService.addListener("${dataId}", "${group}", new PropertiesListener() {
                @Override
                public void innerReceive(Properties properties) {
                    // TODO Auto-generated method stub
                    acmProperties = properties;
                    System.out.println(properties);
                }
            });
            **/
        } catch (ConfigException e) {
            e.printStackTrace();
        }
        // 測試讓主線程不退出,因為訂閱配置是守護線程,主線程退出守護線程就會退出。 正式代碼中無需下面代碼
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    // 通過get介面把配置值暴露出去使用
    public static String getConfig() {
        return config;
    }
    // 通過get介面把配置值暴露出去使用
    public static Object getPorpertiesValue(String key) {
        if (acmProperties != null) {
            return acmProperties.get(key);
        }
        return null;
    }
}

傳參方式

為了協助您快速入門,以上範例程式碼中採用了以代碼初始化參數的方式。但是,實際生產中可能有不同環境,例如不同的帳號、地區或命名空間,而參數因環境而異,因此需要通過變數傳入。為了方便配置入參和降低配置成本,ACM 提供了多種傳參方式。

說明 在 EDAS 環境下發布需要注意,EDAS 沒有公網環境。
初始化參數 傳參方法
endpoint 優先順序由高到低:
  1. JVM 參數:-Daddress.server.domain=xxx
  2. 環境變數:address_server_domain=xxx
  3. 代碼設定:如以上範例程式碼
namespace 優先順序由高到低:
  1. JVM 參數:-Dtenant.id=xxx
  2. 代碼設定:如以上範例程式碼
ramRoleName 優先順序由高到低:
  1. JVM 參數:-Dram.role.name=xxx
  2. 代碼設定:如以上範例程式碼
說明 ramRoleName 的鑒權優先順序高於 accessKey/ secretKey
accessKey/secretKey 優先順序由高到低:
  1. 檔案方式:accessKey 和 secretKey 以 Properties 格式(滿足 public void java.io.Reader.Properties.load(Reader reader) 方法)儲存在 -Dspas.identity 指定檔案中。如果不指定,則預設取 /home/admin/.spas_key/<appName>檔案(<appName>-Dproject.name 指定)
  2. 環境變數:spas_accessKey=xxx spas_secretKey=xxx
  3. 代碼設定:如以上範例程式碼

更多資訊