全部產品
Search
文件中心

Application Configuration Management(Deprecated):通過ACM動態推送配置

更新時間:Jul 06, 2024

如需為部署在多台伺服器的應用更改配置,在各台伺服器上逐一更改顯然效率太低。您可以使用ACM集中管理配置。ACM會將更新後的配置動態推送到所有伺服器。本文結合具體情境介紹此操作流程。

前提條件

  • 已開通ACM服務。
  • 伺服器上已安裝JDK,並已設定環境變數JAVA_HOME
  • 伺服器上已安裝Maven。關於如何安裝和使用Maven,請參考Maven官方文檔

背景資訊

在傳統的配置發布模式下,如果一個應用部署在多台伺服器上,配置變更就需要再在所有伺服器上逐一更改,效率低且工作繁瑣。

您可以在ACM中簡化此操作。首先您需要在ACM中為應用建立配置,並在應用中使用ACM的原生API監聽此配置的變更。當您在ACM控制台更改此配置後,所有部署了該應用的伺服器都會收到變更後的配置內容,應用狀態也會隨之重新整理。

以下使用樣本情境進行說明。

應用myapp.jar部署在生產環境的兩台伺服器上。該應用程式套件含一個設定檔app.cfg,該設定檔包含線程池大小threadPoolSize和記錄層級logLevel這兩個配置項。現在需要同時調整該應用在上述兩台伺服器上的配置,並動態重新整理應用的狀態。

圖 1. 樣本情境:通過ACM動態推送配置通過ACM動態推送配置

步驟一:在ACM中建立配置

  1. 登入ACM控制台,在頂部功能表列選擇地區。
  2. 在左側導覽列選擇配置列表,在頁面上方選擇命名空間,然後在頁面左側單擊建立配置
    建立配置
  3. 在彈出的建立配置面板中填寫配置資訊,配置完成後單擊建立
    建立配置
    參數描述
    Data ID配置ID。建議採用package.class的命名規範,其中class部分是具有業務含義的配置名稱,例如:com.foo.bar.log.level。Data ID在一個Group下是唯一的。
    Group配置分組,建議填寫產品名或模組名。Group是全域唯一的。
    資料加密您可完成如下配置來統一使用Key Management Service(KMS)對配置進行加密:
    1. 開啟資料加密
    2. 資料加密地區單擊前往授權
    3. 雲資源訪問授權頁面選擇AliyunACMAccessingKMSRole並單擊同意授權
    4. 重新整理建立配置面板,選擇KMS加密方式。
    配置格式配置內容的資料格式。
    配置內容輸入配置的內容,例如:
    threadPoolSize=5
    logLevel=WARN
    配置描述配置描述資訊。
    更多配置
    • 應用:配置歸屬的應用程式名稱。
    • 標籤:在文字框中輸入標籤資訊,並單擊標籤選取器。

步驟二:使用ACM原生API監聽配置變更

  1. 下載範例工程myapp.zip,或者運行以下命令來建立Maven工程。
    mvn archetype:generate -DgroupId=com.acm.sample -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    建立的工程結構如下:

    myapp
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- com
        |           `-- acm
        |               `-- sample
        |                   `-- App.java
        `-- test
            `-- java
                `-- com
                    `-- mycompany
                        `-- app
                            `-- AppTest.java
  2. 在pom.xml中添加對ACM Client原生API的依賴。
    <dependencies>
         <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>
     </dependencies>
  3. 在pom.xml中添加maven-assembly-plugin打包外掛程式。
    <plugin>
       <artifactId>maven-assembly-plugin</artifactId>
       <version>2.4</version>
       <configuration>
          <finalName>myapp</finalName>
          <descriptorRefs>
             <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <appendAssemblyId>false</appendAssemblyId>
          <archive>
             <manifest>
                <mainClass>com.acm.sample.App</mainClass>
             </manifest>
          </archive>
       </configuration>
       <executions>
          <execution>
             <id>make-assembly</id>
             <phase>package</phase>
             <goals>
                <goal>single</goal>
             </goals>
          </execution>
       </executions>
    </plugin>
  4. 使用ACM Client原生API監聽配置變更。
    說明 以下代碼中的$endpoint$namespace$accesskey$secretKey等變數的值,可在ACM控制台的配置列表頁面擷取和查看。 查看參數資訊
    //-- App.java
    package com.acm.sample;
    
    import java.io.IOException;
    import java.io.StringReader;
    import java.util.Properties;
    import com.alibaba.edas.acm.listener.ConfigChangeListener;
    import com.alibaba.edas.acm.ConfigService;
    import com.alibaba.edas.acm.exception.ConfigException;
    
    public class App {
    
         private static Properties appCfg = new Properties();
    
         public static void initAndWatchConfig() {
             final String dataId = "com.acm.myapp.app.cfg";
             final String group = "myapp";
             final long timeoutInMills = 3000;
    
             // 從命名空間詳情對話方塊中拷貝各變數的值Properties properties = new Properties();
             properties.put("endpoint", "$endpoint");
             properties.put("namespace", "$namespace");
    
             // 如果通過AK/SK訪問ACM
             properties.put("accessKey", "$accessKey");
             properties.put("secretKey", "$secretKey");
    
             // 如果通過ECS執行個體RAM角色訪問ACM
             // properties.put("ramRoleName", "$ramRoleName");
    
             // 如果是加密配置,則添加以下兩行進行自動解密
             // properties.put("openKMSFilter", true);
             // properties.put("regionId", "$regionId");
    
             ConfigService.init(properties);
    
             // 直接擷取配置內容try {
                 String configInfo = ConfigService.getConfig(dataId, group, timeoutInMills);
                 appCfg.load(new StringReader(configInfo));
             } catch (ConfigException e1) {
                 e1.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
    
             // 監聽配置變化,擷取最新推送值ConfigService.addListener(dataId, group, new ConfigChangeListener() {
                 public void receiveConfigInfo(String configInfo) {
                     try {
                         appCfg.load(new StringReader(configInfo));
                     } catch (Exception e) {
                         // process exception
                     }
                     refreshApp();
                 }
             });
         }
    
         public static void refreshApp() {
             System.out.println("current thread pool size: " + appCfg.getProperty("threadPoolSize"));
             System.out.println("current log level: " + appCfg.getProperty("logLevel"));
             System.out.println("");
         }
    
         public static void main(String[] args) {
             initAndWatchConfig();
    
             // 以下代碼用於測試,作用是讓主線程不退出。訂閱配置是守護線程,如果主線程退出守護線程就會退出。while (true) {
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
                 }
             }
         }
     }

步驟三:部署並啟動應用

  1. 在專案根目錄執行以下打包命令,將應用打包成JAR檔案,並拷貝到兩台伺服器上。
    mvn clean package
  2. 在Shell中部署並啟動應用。
    ${JAVA_HOME}/java -cp myapp.jar com.acm.sample.App

步驟四:在ACM控制台更改配置

  1. 登入ACM控制台,在頂部功能表列選擇地區。
  2. 在左側導覽列選擇配置列表,在配置列表頁面選擇建立的配置,然後在操作列單擊編輯
  3. 編輯配置頁面上將配置內容更改為以下內容,並單擊發布
    threadPoolSize=15
    logLevel=DEBUG
  4. 內容比較對話方塊中查看更改前後的對比,確認無誤後單擊發布

執行結果

發布配置之後,部署了myapp應用的兩台伺服器均收到了更新後的配置,並在Console中列印了以下日誌。

current thread pool size: 15
current log level: DEBUG