全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多

快速入门

更新时间:2018-04-19 15:09:06

本文通过两个快速开始任务,帮助您快速了解 ACM 产品最基本的概念和功能:

  • 创建并动态调整配置项
  • 管理不同环境的配置

从开通 ACM 服务到完成基本任务的流程如下:

quickstart

开通 ACM 服务

在使用 ACM 前请先按以下步骤开通服务:

  1. 登录阿里云官网。

  2. 将鼠标依次移动到产品 > 云计算基础服务 > 互联网中间件,然后单击应用配置管理 ACM,进入产品主页。

  3. 在产品主页上单击立即开通,根据提示完成服务开通。

如果您已经开通服务,请直接登录 ACM 控制台

任务一:创建并动态调整配置值

场景介绍

业务应用 myapp.jar 被部署到 2 台生产环境的服务器上。该应用包含一个配置文件 app.cfg,配置文件里包含线程池大小和日志级别两个配置项。现在需要同时调整应用在两台机器上的配置,并动态刷新应用的状态。

场景如下图:

quick_start_pi

配置内容如下:

  1. ## app.cfg ##
  2. threadPoolSize=5
  3. logLevel=WARN

操作步骤

STEP 1:在 ACM 中创建配置

  1. 登录 ACM 控制台

  2. 在左侧导航栏选择配置管理,单击右上角新建配置

    quick_start_pi

  3. 新建配置页面输入以下内容。

    • DataID: com.acm.myapp.app.cfg
    • Group: myapp
    • Content:
      1. threadPoolSize=5
      2. logLevel=WARN

    如图所示:

    quick_start_pi

STEP 2: 创建 maven 项目工程

  1. 创建 Maven 工程或者下载工程 myapp.tar

    关于如何安装和使用 Maven,请参考 Maven 官方文档

    1. mvn archetype:generate -DgroupId=com.acm.sample -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    通过上述命令,我们创建了如下的工程结构:

    1. myapp
    2. |-- pom.xml
    3. `-- src
    4. |-- main
    5. | `-- java
    6. | `-- com
    7. | `-- acm
    8. | `-- sample
    9. | `-- App.java
    10. `-- test
    11. `-- java
    12. `-- com
    13. `-- mycompany
    14. `-- app
    15. `-- AppTest.java
  2. 在 Pom 中添加 ACM Client Native API 依赖。

    1. <dependencies>
    2. <dependency>
    3. <groupId>com.alibaba.edas.acm</groupId>
    4. <artifactId>acm-sdk</artifactId>
    5. <version>1.0.6</version>
    6. </dependency>
    7. <!-- 有日志实现,下面可去掉 -->
    8. <dependency>
    9. <groupId>ch.qos.logback</groupId>
    10. <artifactId>logback-classic</artifactId>
    11. <version>1.1.7</version>
    12. </dependency>
    13. </dependencies>
  3. 使用 API 监听配置变更。

    1. //-- App.java
    2. package com.acm.sample;
    3. import java.io.IOException;
    4. import java.io.StringReader;
    5. import java.util.Properties;
    6. import com.alibaba.edas.acm.listener.ConfigChangeListener;
    7. import com.alibaba.edas.acm.ConfigService;
    8. import com.alibaba.edas.acm.exception.ConfigException;
    9. public class App {
    10. private static Properties appCfg = new Properties();
    11. public static void initAndWatchConfig() {
    12. final String dataId = "com.acm.myapp.app.cfg";
    13. final String group = "myapp";
    14. final long timeoutInMills = 3000;
    15. // 从控制台命名空间管理中拷贝对应值
    16. Properties properties = new Properties();
    17. properties.put("endpoint", "$endpoint");
    18. properties.put("namespace", "$namespace");
    19. properties.put("accessKey", "$accessKey");
    20. properties.put("secretKey", "$secretKey");
    21. // 如果是加密配置,则添加下面两行进行自动解密
    22. // properties.put("openKMSFilter", true);
    23. // properties.put("regionId", "$regionId");
    24. ConfigService.init(properties);
    25. // 启动只用一次场景,直接get获取配置值
    26. try {
    27. String configInfo = ConfigService.getConfig(dataId, group, timeoutInMills);
    28. appCfg.load(new StringReader(configInfo));
    29. } catch (ConfigException e1) {
    30. e1.printStackTrace();
    31. } catch (IOException e) {
    32. e.printStackTrace();
    33. }
    34. // 监听配置变化,获取最新推送值
    35. ConfigService.addListener(dataId, group, new ConfigChangeListener() {
    36. public void receiveConfigInfo(String configInfo) {
    37. try {
    38. appCfg.load(new StringReader(configInfo));
    39. } catch (Exception e) {
    40. // process exception
    41. }
    42. refreshApp();
    43. }
    44. });
    45. }
    46. public static void refreshApp() {
    47. System.out.println("current thread pool size: " + appCfg.getProperty("threadPoolSize"));
    48. System.out.println("current log level: " + appCfg.getProperty("logLevel"));
    49. System.out.println("");
    50. }
    51. public static void main(String[] args) {
    52. initAndWatchConfig();
    53. // 让主线程不退出
    54. while (true) {
    55. try {
    56. Thread.sleep(1000);
    57. } catch (InterruptedException e) {
    58. }
    59. }
    60. }
    61. }

STEP 3:部署并启动应用

将 Jar 包拷贝到两台或者一台服务器上部署并启动应用。

可以通过在 shell 中执行以下命令行完成部署:

  1. ${JAVA_HOME}/java -cp myapp.jar com.acm.sample.App

为了运行 Java 程序,您需要在机器上安装 JDK 并设置环境变量 JAVA_HOME。

STEP 4:在 ACM 控制台查询并变更配置

  1. 登录 ACM 控制台。

  2. 搜索 STEP1 中创建的配置。

    quick_start_pi

  3. 单击详情查看配置详情。

    quick_start_pi

  4. 编辑配置内容。

    调整配置项内容为:

    1. threadPoolSize=15
    2. logLevel=DEBUG

    如图:

  5. 单击发布

STEP 5:检查结果

发布配置之后,可以看到在两台部署的机器上,应用同时收到配置变更信息,打印了如下信息。

  1. current thread pool size: 15
  2. current log level: DEBUG

总结

快速开始任务一中,我们为应用 myapp 在 ACM 上创建了一个配置,同时在程序中使用 ACM 的 Native API 监听这个配置的变更。当我们在 ACM Console 上做了配置变更后,所有部署应用的服务器上会收到变更的配置内容,应用状态也随之刷新。

任务二:在不同的环境中设置不同的配置

场景介绍

在该任务中,我们将使用 ACM 提供的 Namespace 功能为应用的同一个配置在测试环境,预生产和生产环境设置不同的值。

如图:

quick_start_pi

操作步骤

STEP 1: 在 ACM 上创建命名空间

下面以创建命名空间 Development 为例。

  1. 登录 ACM 控制台

  2. 在左侧导航栏选择 命名空间,单击右上角的添加按钮:

    quick_start_pi

  3. 新建命名空间对话框中输入命名空间名 Development

    quick_start_pi

  4. 按 1-3 同样步骤继续创建 Testing,Staging 命名空间。

STEP 2:在命名空间下创建配置

  1. 在配置管理页面,选择命名空间 Development

    quick_start_pi

  2. 采用与任务一:STEP 1 同样的步骤创建同名配置。

总结

在任务二中我们完成了典型的多环境配置管理。在实际的业务场景中,经常需要针对不同的环境为同一个配置项设置不同的配置值。在 ACM 中可以通过 Namespace 的功能来方便的实现多环境配置管理。

本文导读目录