从ACM迁移到MSE Nacos

ACM已进入下线状态,将于2022年11月22日停止全面支持,停止支持后您将无法在ACM控制台新建和编辑配置。所有配置管理相关的需求由MSE中的Nacos承接(ACM独享版,更好的安全和稳定性)。本文介绍如何从ACM控制台导出配置,然后将配置导入MSE控制台完成迁移。

重要

ACM停止支持后,您将无法在ACM控制台新建和编辑配置,但仍能通过接口获取配置。值得注意的是,ACM停止支持后,接口缺少SLA保障,因此建议您尽快完成配置迁移。

步骤一:将配置导出至MSE Nacos

  1. 使用阿里云账号登录MSE购买页,购买Nacos。

建议用PRO版,支持Nacos2.0,支持配置鉴权和加密,有更好的高可用保障。具体Nacos专业版CPU核数、内存数、机器数的选型,请参见微服务注册配置中心实例能力评估。购买公网带宽可以按照每秒变更频率(单位:次/s)*配置数*配置大小(单位:KB)进行单位换算来评估。

  1. 在ACM控制台导出需要迁移的配置。

    1. 登录ACM控制台

    2. 配置列表页面选择目标配置,在配置列表下方单击导出,然后在导出配置(public)对话框中单击导出

      1
    3. 存储导出的配置文件。

  2. 在MSE控制台导入配置。

    1. 登录MSE控制台

    2. 在左侧导航栏,选择注册配置中心 > 实例列表

    3. 实例列表页面,单击之前购买的Nacos实例的实例ID

    4. 在左侧导航栏,选择配置管理 > 配置列表

    5. 配置列表页面,单击导入配置

    6. 导入配置对话框选择相同配置的处理方式,然后单击上传文件,上传从ACM控制台导出的配置文件,最后单击确定导入2

步骤二:替换应用业务参数

请根据您的应用类型,选择相应的步骤替换应用业务参数:

迁移spring-cloud-alibaba应用

如果您的应用为spring-cloud-alibaba应用,修改应用程序的bootstrap.properties配置文件。

将如下内容:

spring.cloud.nacos.config.endpoint=${ACM的公网/私网地址}

替换为:

spring.cloud.nacos.config.server-addr=${MSE的公网/私网地址}

并且在如下配置中,将Namespace替换为MSE中的Namespace:

spring.cloud.nacos.config.namespace=${MSE的namespaceID}

可运行的示例Demo,请参见acm2nacos-spring-cloud-example

您可以通过以下方式鉴别您的应用是否为spring-cloud-alibaba应用:

pom.xml文件中如果发现如下内容,则表明您的应用为spring-cloud-alibaba应用。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
重要

  • 只有MSE Nacos 2.0.3以上版本才支持这种方式升级,如果您的MSE Nacos版本在2.0.2以下,请通过MSE控制台进行升级,升级过程大概需要5~6分钟,请您耐心等待。具体操作,请参见升级引擎版本

  • 为保障集群的高可用,请将集群节点设置为最少3个节点。

  • MSE Nacos实例的公网和私网地址可以在实例的基础信息页面获取。

    3
  • MSE中默认命名空间(Namespace)为空,可以不填写。如果导入的命名空间ID不为空,可以在Nacos实例的命名空间页面获取。1

如果您使用公网地址进行部署,为了保证连通性,您需要将客户端列入白名单。具体操作,请参见设置白名单

说明

如果白名单配置内容为空,表示本地所有地址均可访问该应用。

迁移Java应用

  • 如果您使用的是ACM-Java-SDK,即您的依赖pom.xml中存在如下关键字:

    <dependency>
        <groupId>com.alibaba.edas.acm</groupId>
        <artifactId>acm-sdk</artifactId>
    </dependency>

    则可以直接在JVM运行参数中添加如下参数,并重新部署,即可完成迁移。

    -DDIAMOND.SERVER.IPS=${MSE的公网/私网地址}

    另外,请在代码中修改Namespace设置相关代码。

    properties.put("namespace", "{namespaceId}");

  • 如果您使用的是ACM客户端,希望变更为Nacos客户端,可参考如下关于Nacos-Java-SDK用户迁移的指导。

  • 如果您使用的是Nacos-Java-SDK,即您的依赖pom.xml中存在如下关键字:

<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
</dependency>

则可以将如下代码中的${}内容替换成MSE的注册地址,将${namespaceId}替换为MSE的命名空间ID(如果您使用的是默认命名空间,则该处内容置空即可),然后重新部署。

properties.put("serverAddr", ${MSE的公网/私网地址});
properties.put("namespace", "{namespaceId}");

在启动时增加如下参数,即可完成迁移。

 -Dnacos.cache.data.init.snapshot=false
说明

nacos-sdk迁移示例Demo,请参见acm2nacos-java-example;Java官方应用示例Demo,请参见Java SDK

迁移nacos-spring-boot应用

如果您的应用是spring-cloud-alibaba应用,修改应用程序的application.properties配置文件。

将如下内容:

nacos.config.endpoint=${ACM的公网/私网地址}

替换为:

nacos.config.server-addr=${MSE的公网/私网地址}

并且在如下配置中,将Namespace替换为MSE中的Namespace:

nacos.config.namespace=${MSE的namespaceID}

迁移Golang应用

  • 如果您使用的是ACM-golang-SDK,则需要将${endpoint}替换为MSE的注册地址。

    clientConfig := constant.ClientConfig{
            Endpoint:       ${endpoint} + ":8080",
            NamespaceId:    namespaceId,
            AccessKey:      accessKey,
            SecretKey:      secretKey,
            TimeoutMs:      5 * 1000,
            ListenInterval: 30 * 1000,
        }
  • 如果您使用的是Nacos-golang-SDK,则需要将${serverAddr}替换为MSE的注册地址。

    sc := []constant.ServerConfig{
        {
        IpAddr: "${serverAddr}",
        Port:   8848,
        },
    }
说明

Golang官方应用示例Demo,请参见nacos-sdk-go

迁移Python应用

  • 如果您使用的是ACM-Python-SDK,则需要将${endpoint}${namespace_id}替换为MSE的注册地址和命名空间ID。

    ENDPOINT = "${endpoint}"
    NAMESPACE = "${namespace_id}"
    c = acm.ACMClient(ENDPOINT, NAMESPACE, AK, SK)
  • 如果您使用的是Nacos-Python-SDK,则需要将${server_address}${namespace_id}替换为MSE的注册地址和命名空间ID。

    SERVER_ADDRESSES = "${server_address}"
    NAMESPACE = "${namespace_id}"
    client = nacos.NacosClient(SERVER_ADDRESSES, namespace=NAMESPACE)

迁移Node.js应用

  • 如果您使用的是ACM-Nodejs-SDK,则需要将${endpoint}${namespace_id}替换为MSE的注册地址和命名空间ID。

    // for find address mode
    const configClient = new NacosConfigClient({
      endpoint: '${endpoint}',
      namespace: '${namespace_id}',
      accessKey: '***************',
      secretKey: '***************',
      requestTimeout: 6000,
    });
  • 如果您使用的是Nacos-Nodejs-SDK,则需要将${server_address}${namespace_id}替换为MSE的注册地址和命名空间ID。

    const configClient = new NacosConfigClient({
      serverAddr: '${server_address}',
      namespace: '${namespace_id}',
      accessKey: '***************',
      secretKey: '***************',
      requestTimeout: 6000,
    });

迁移C#应用

请将${server_address}${namespace_id}替换为MSE的注册地址。

{
  "NacosConfig": {
    "Listeners": [
      {
        "Optional": false,
        "DataId": "common",
        "Group": "DEFAULT_GROUP"
      },
      {
        "Optional": false,
        "DataId": "demo",
        "Group": "DEFAULT_GROUP"
      }
    ],
    "Namespace": "namespace_id",  // Please set the value of Namespace ID !!!!!!!!
    "ServerAddresses": [ "http://${server_address}:8848/" ],
    "UserName": "test2",
    "Password": "123456",
    "AccessKey": "",
    "SecretKey": "",
    "EndPoint": "acm.aliyun.com",
    "ConfigFilterAssemblies": ["YouPrefix.AssemblyName"],
    "ConfigFilterExtInfo": "some ext infomation"
  }
}

迁移C++应用

  • 如果您使用的是ACM-CPP-SDK,则需要将${endpoint}${namespace_id}替换为MSE的注册地址和命名空间ID。

    // Initialize configuration service and the console will retrieve the following parameters through the sample code.
     ACM::init("${endpoint}","$namespace_id","$accessKey","$secretKey");
  • 如果您使用的是Nacos-CPP-SDK,则需要将${server_address}替换为MSE的注册地址。

    Properties props;
    props[PropertyKeyConst::SERVER_ADDR] = "${serverAddr}:8848";//Server address

(可选)步骤三:重新给RAM用户授权

如果您使用了配置鉴权功能,对于指定RAM用户进行了授权。您需要在应用迁移至MSE之后,进行鉴权脚本的替换,重新对RAM用户进行新的授权。MSE的鉴权脚本配置示例,请参见RAM授权访问注册配置中心

  1. 登录RAM控制台

  2. 在左侧导航栏,选择权限管理 > 权限策略

  3. 在权限策略页面左上角,单击创建权限策略

  4. 创建权限策略页面,单击脚本编辑页签。

  5. 在本地复制脚本,并进行替换。

    示例脚本如下:

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "acms:R"
                ],
                "Resource": "*:*:*:*:cfg/1ca01ca0-11b0-1e01-0df1-d1010101bc10/DEFAULT_GROUP/com.alibaba.acm.test",
                "Effect": "Allow"
            }
        ]
    }
  • 替换读权限

    如果其中包含如下内容:

    "Action": [
                    "acms:R"
                ]

    替换为:

    "Action": [
                    "mse:List*",
                    "mse:Query*",
                    "mse:Get*"
                ]
  • 替换写权限

    如果其中包含如下内容:

    "Action": [
                    "acms:W"
                ]

    替换为:

    "Action": [
                    "mse:Create*",
                    "mse:Update*",
                    "mse:Delete*"
                ]
  • 替换资源

    请将如下内容:

    "Resource": "*:*:*:*:cfg/{acm_namespace_id}/{group_id}/{data_id}"

    替换为:

    "Resource": "acs:mse:*:*:instance/{instance_id}/{mse_namespace_id}/{group_id}/{data_id}"
    说明

    参数说明如下:

    • {acm_namespace_id}:ACM产品的命名空间ID。

    • {instance_id}:MSE中的实例ID。

    • {mse_namespace_id}:MSE产品的命名空间ID。

    • {group_id}:组ID。

    • {data_id}:Data ID。

如果您不需要精确到group_id级别或者data_id级别的鉴权,可以将其删除。

  • 如果您只需要精确到namespace级别的鉴权,请替换为:

    "Resource": "acs:mse:*:*:instance/{instance_id}/{mse_namespace_id}"
  • 如果您只需要精确到group_id级别的鉴权,请替换为:

    "Resource": "acs:mse:*:*:instance/{instance_id}/{mse_namespace_id}/{group_id}"

替换完成之后,对RAM用户重新授权该脚本相应的权限。具体操作,请参见RAM授权访问注册配置中心

重新授权大约5~10s后,MSE的RAM用户权限生效。

步骤四:重新部署并启动应用

请将您的业务重新部署。部署成功之后,即完成了整个迁移流程。

阿里云首页 微服务引擎MSE 相关技术圈