本文說(shuō)明如何使用 Nacos Client SDK 管理 ACM 配置。

前提條件

登錄 ACM控制臺(tái),并創(chuàng)建一個(gè)示例配置。

  • Data ID:com.alibaba.nacos.example.properties
  • Group:不填寫(xiě),即使用默認(rèn)的 DEFAULT_GROUP
  • 配置格式:Properties
  • 配置內(nèi)容:connectTimeoutInMills=3000

操作步驟

  1. 在 Maven 項(xiàng)目的 pom.xml 文件中添加以下配置來(lái)獲取 Nacos Client SDK。

    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>${latest.version}</version>
    </dependency>
    <!--  有日志實(shí)現(xiàn),下面可去掉  -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
  2. 在工程中添加以下代碼進(jìn)行配置管理。

    說(shuō)明 請(qǐng)將代碼中的 ${endpoint}${namespace}${accessKey}${secretKey} 分別替換為 ACM 控制臺(tái)上命名空間詳情對(duì)話框內(nèi)的 End Point命名空間 IDAccessKeySecretKey。出于安全考慮,建議使用 RAM 用戶的 AccessKey 和 SecretKey。
    import com.alibaba.nacos.api.NacosFactory;
    import com.alibaba.nacos.api.PropertyKeyConst;
    import com.alibaba.nacos.api.config.ConfigService;
    import com.alibaba.nacos.api.exception.NacosException;
    import com.alibaba.nacos.client.config.listener.impl.PropertiesListener;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import java.util.Properties;
    /**
     * 示例代碼,僅用于示例測(cè)試
     */
    public class NacosExample {
        private static final Logger LOGGER = LoggerFactory.getLogger(NacosExample.class);
        public static void main(String[] args) throws NacosException {
            Properties properties = new Properties();
            // 指定配置的 DataID 和 Group
            String dataId = "${dataId}";
            String group = "${group}";
            String content = "connectTimeoutInMills=5000";
            // 從控制臺(tái)命名空間管理的"命名空間詳情"中拷貝 endpoint、namespace 
            properties.put(PropertyKeyConst.ENDPOINT, "${endpoint}");
            properties.put(PropertyKeyConst.NAMESPACE, "${namespace}");
             // 通過(guò) ECS 實(shí)例 RAM 角色訪問(wèn) ACM
             // properties.put("ramRoleName", "$ramRoleName");
            properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");
            properties.put(PropertyKeyConst.SECRET_KEY, "${secretKey}");
            ConfigService configService = NacosFactory.createConfigService(properties);
            // 發(fā)布配置
            boolean publishConfig = configService.publishConfig(dataId, group, content);
            LOGGER.info("publishConfig: {}", publishConfig);
            wait2Sync();
            // 查詢配置
            String config = configService.getConfig(dataId, group, 5000);
            LOGGER.info("getConfig: {}", config);
            // 監(jiān)聽(tīng)配置
            configService.addListener(dataId, group, new PropertiesListener() {
                @Override
                public void innerReceive(Properties properties) {
                    LOGGER.info("innerReceive: {}", properties);
                }
            });
            // 更新配置
            boolean updateConfig = configService.publishConfig(dataId, group, "connectTimeoutInMills=3000");
            LOGGER.info("updateConfig: {}", updateConfig);
            wait2Sync();
            // 刪除配置
            boolean removeConfig = configService.removeConfig(dataId, group);
            LOGGER.info("removeConfig: {}", removeConfig);
            wait2Sync();
            config = configService.getConfig(dataId, group, 5000);
            LOGGER.info("getConfig: {}", config);
        }
        private static void wait2Sync() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // ignore
            }
        }
    }

結(jié)果驗(yàn)證

  1. 在本地啟動(dòng)項(xiàng)目,若 Console 打印出以下信息,則說(shuō)明 SDK 可正常使用。

    12:40:45.567 [main] INFO DemoConfig - getConfig: connectTimeoutInMills=3000
  2. 在 ACM 控制臺(tái)將示例配置 com.alibaba.nacos.example.properties 更改為以下內(nèi)容并發(fā)布。

    connectTimeoutInMills=6000

    若 Console 打印出以下信息 ,則說(shuō)明 SDK 的配置監(jiān)聽(tīng)功能正常。

    [com.alibaba.nacos.client.Worker.longPolling.acm.aliyun.com-********] INFO DemoConfig - innerReceive: {connectTimeoutInMills=6000}

傳參方式

為幫助您快速入門(mén),以上示例代碼采用了以代碼初始化參數(shù)的方式。但是實(shí)際生產(chǎn)中可能有不同環(huán)境(如不同的賬號(hào)、地域或 命名空間 等),參數(shù)因環(huán)境而異,因此需要通過(guò)變量傳入。為方便配置入?yún)ⅰ⒔档团渲贸杀荆珹CM 針對(duì)不同的初始化參數(shù)分別提供了多種傳參方式,詳見(jiàn)下表。
說(shuō)明 對(duì)于阿里云 EDAS 用戶而言,EDAS 會(huì)在發(fā)布環(huán)節(jié)自動(dòng)注入?yún)?shù),用戶無(wú)需采取任何操作。
初始化參數(shù) 傳參方式
endpoint 代碼設(shè)置:詳見(jiàn)以上示例代碼。
namespace 優(yōu)先級(jí)由高到低:
  1. JVM 參數(shù):-Dtenant.id=xxx
  2. 代碼設(shè)置:詳見(jiàn)以上示例代碼。
accessKey/secretKey 優(yōu)先級(jí)由高到低:
  1. 文件:accessKey 和 secretKey 以 Properties 格式(滿足 public void java.io.Reader.Properties.load(Reader reader) 方法的要求)存儲(chǔ)在 -Dspas.identity 指定的文件中。如果不指定,則默認(rèn)取 /home/admin/.spas_key/<應(yīng)用名>文件,<應(yīng)用名>-Dproject.name 指定。
  2. 環(huán)境變量:spas_accessKey=xxx spas_secretKey=xxx
  3. 代碼設(shè)置:請(qǐng)參見(jiàn)以上示例代碼。
ramRoleName 優(yōu)先級(jí)由高到低:
  1. JVM 參數(shù):-Dram.role.name=xxx
  2. 代碼設(shè)置:請(qǐng)參見(jiàn)以上示例代碼。
說(shuō)明 ramRoleName 的鑒權(quán)優(yōu)先級(jí)高于 accessKey/ secretKey

更多信息