如需為部署在多台伺服器的應用更改配置,在各台伺服器上逐一更改顯然效率太低。您可以使用ACM集中管理配置。ACM會將更新後的配置動態推送到所有伺服器。本文結合具體情境介紹此操作流程。
前提條件
背景資訊
在傳統的配置發布模式下,如果一個應用部署在多台伺服器上,配置變更就需要再在所有伺服器上逐一更改,效率低且工作繁瑣。
您可以在ACM中簡化此操作。首先您需要在ACM中為應用建立配置,並在應用中使用ACM的原生API監聽此配置的變更。當您在ACM控制台更改此配置後,所有部署了該應用的伺服器都會收到變更後的配置內容,應用狀態也會隨之重新整理。
以下使用樣本情境進行說明。
應用myapp.jar部署在生產環境的兩台伺服器上。該應用程式套件含一個設定檔app.cfg,該設定檔包含線程池大小threadPoolSize和記錄層級logLevel這兩個配置項。現在需要同時調整該應用在上述兩台伺服器上的配置,並動態重新整理應用的狀態。
步驟一:在ACM中建立配置
- 登入ACM控制台,在頂部功能表列選擇地區。
- 在左側導覽列選擇配置列表,在頁面上方選擇命名空間,然後在頁面左側單擊建立配置。
- 在彈出的建立配置面板中填寫配置資訊,配置完成後單擊建立。
參數 描述 Data ID 配置ID。建議採用package.class的命名規範,其中class部分是具有業務含義的配置名稱,例如:com.foo.bar.log.level。Data ID在一個Group下是唯一的。 Group 配置分組,建議填寫產品名或模組名。Group是全域唯一的。 資料加密 您可完成如下配置來統一使用Key Management Service(KMS)對配置進行加密: - 開啟資料加密。
- 在資料加密地區單擊前往授權。
- 在雲資源訪問授權頁面選擇AliyunACMAccessingKMSRole並單擊同意授權。
- 重新整理建立配置面板,選擇KMS加密方式。
配置格式 配置內容的資料格式。 配置內容 輸入配置的內容,例如: threadPoolSize=5 logLevel=WARN
配置描述 配置描述資訊。 更多配置 - 應用:配置歸屬的應用程式名稱。
- 標籤:在文字框中輸入標籤資訊,並單擊標籤選取器。
步驟二:使用ACM原生API監聽配置變更
- 下載範例工程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
- 在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>
- 在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>
- 使用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) { } } } }
步驟三:部署並啟動應用
- 在專案根目錄執行以下打包命令,將應用打包成JAR檔案,並拷貝到兩台伺服器上。
mvn clean package
- 在Shell中部署並啟動應用。
${JAVA_HOME}/java -cp myapp.jar com.acm.sample.App
步驟四:在ACM控制台更改配置
- 登入ACM控制台,在頂部功能表列選擇地區。
- 在左側導覽列選擇配置列表,在配置列表頁面選擇建立的配置,然後在操作列單擊編輯。
- 在編輯配置頁面上將配置內容更改為以下內容,並單擊發布。
threadPoolSize=15 logLevel=DEBUG
- 在內容比較對話方塊中查看更改前後的對比,確認無誤後單擊發布。
執行結果
發布配置之後,部署了myapp應用的兩台伺服器均收到了更新後的配置,並在Console中列印了以下日誌。
current thread pool size: 15
current log level: DEBUG