使用API管理ECS集群中的应用实例分组

本文介绍如何使用EDAS提供的Java SDK调用API管理ECS集群中的应用实例分组。

前提条件

在管理ECS集群中的应用实例分组前,您必须提前完成以下准备工作:

  • 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南
  • 确定应用所在地域,假设为cn-hangzhou

  • 创建应用实例分组前,请先调用ListHistoryDeployVersion接口查询应用部署的历史版本列表,获取目标版本的唯一标识(PackageVersion.Id)。

  • 更换分组前,请先调用ListApplicationEcc接口查询应用的ECC信息,获取目标ECS实例的ECC ID(EccId)。

  • 创建ECS实例。假设为i-bp13o01lzmbsvhsl****i-bp13o01lzmbsvhsl****

  • 创建ECS集群,具体操作,请参见使用API创建ECS集群

    如果您已经创建了ECS集群,则可以调用ListCluster接口查询集群列表,获取目标ECS集群的集群ID(ClusterId),假设为369d06d7-450b-4f3d-bf75-9536fcd9****

背景信息

实例分组,指的是将应用中ECS实例进行分组,以便在不同分组中部署不同版本的应用。您可以通过实例分组进行流量管理和灰度发布。

例如:应用itemcenter一共部署了10个ECS实例,将这些实例分为两个组,分别为默认分组Beta分组。其中默认分组包含6个实例,Beta分组包含4个实例。此时应用就拥有了两个实例分组,可以分别部署不同的应用版本。

说明
  • 每个应用在创建的时候,EDAS默认会为应用创建“默认分组”,该分组不可删除。
  • 如果没有流量管理或灰度发布等多版本部署需求,通常使用这个“默认分组”就足够了,不需要新建其他分组。
  • 部署应用时,优先采用应用分组的JVM参数、Tomcat、实例启动模板以及SLB等配置信息。

创建应用实例分组

以下代码适用于在ECS环境为指定应用创建应用实例分组。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupResponse;

public class InsertDeployGroup {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //应用所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        InsertDeployGroupRequest request = new InsertDeployGroupRequest();
        //指定应用,在该应用中创建应用实例分组。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //自定义新建的应用实例分组名称,支持设置为中文、字母、数字、下划线(_)和半角句号(.),最长64个字符。
        request.setGroupName("Beta");
        //应用分组关联的初始化部署包版本ID,可以调用接口ListHistoryDeployVersion接口获取。
        request.setInitPackageVersionId("3fc52328-8746-4422-a742-94e0cfc7****");

        try {
            InsertDeployGroupResponse response = client.getAcsResponse(request);
            System.out.println("GroupName=" + response.getDeployGroupEntity().getGroupName() + "\nId=" + response.getDeployGroupEntity().getId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

GroupName=Beta
Id=941be68c-4aac-48a1-88fe-c9ad1502****

更换ECS实例的实例分组

说明

更换应用中ECS实例到其他应用实例分组时,只能一次更换一个ECS实例到其他分组。

以下代码适用于在ECS环境下将指定应用的ECS实例更换到其他应用实例分组。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.ChangeDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.ChangeDeployGroupResponse;

public class ChangeDeployGroup {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //应用所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        ChangeDeployGroupRequest request = new ChangeDeployGroupRequest();
        //指定应用,将应用中的ECS实例更换应用实例分组。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //指定要切换应用分组的ECS实例的ECC ID。可以调用ListApplicationEcc接口查询应用的ECC ID。
        request.setEccInfo("4009a824-ce33-4ba0-9ca2-346249a9****");
        //目标应用分组名称,如果需要更换到默认分组,则设置为_DEFAULT_GROUP。
        request.setGroupName("Beta");
        //ECC的部署包版本和应用分组的部署包版本不一致时是否强制更换。true表示强制,false表示不强制。
        request.setForceStatus(true);

        try {
            ChangeDeployGroupResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage() + "\nRequestId=" + response.getRequestId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

Message=success
ChangeOrderId=369d06d7-450b-4f3d-bf75-9536fcd9****

为应用实例分组设置JVM

以下代码适用于在ECS环境下为应用实例分组设置JVM。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.UpdateJvmConfigurationRequest;
import com.aliyuncs.edas.model.v20170801.UpdateJvmConfigurationResponse;

public class UpdateJvmConfiguration {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //应用所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        UpdateJvmConfigurationRequest request = new UpdateJvmConfigurationRequest();
        //指定应用,为应用中的应用实例分组设置JVM参数。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //指定要设置JVM参数的应用实例分组的ID。可以调用ListDeployGroup接口查询应用实例分组ID。
        request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
        //自定义参数。
        request.setOptions("-Dproperty=value");
        //初始化堆内存大小,单位MB。
        request.setMinHeapSize(500);
        //持久代内存大小,单位MB。
        request.setMaxPermSize(500);
        //最大堆内存大小,单位MB。
        request.setMaxHeapSize(500);

        try {
            UpdateJvmConfigurationResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

Message=success

为应用实例分组设置Tomcat

以下代码适用于在ECS环境下为应用实例分组设置Tomcat。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.UpdateContainerConfigurationRequest;
import com.aliyuncs.edas.model.v20170801.UpdateContainerConfigurationResponse;

public class UpdateContainerConfiguration {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //应用所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        UpdateContainerConfigurationRequest request = new UpdateContainerConfigurationRequest();
        //指定应用,为应用中的应用实例分组设置Tomcat。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //指定要设置Tomcat参数的应用实例分组的ID。可以调用ListDeployGroup接口查询应用实例分组ID。
        request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
        //Tomcat的ContextPath,支持空字符串、null-war包名称、ROOT-根目录或其他非空自定义字符串。
        request.setContextPath("");
        //应用端口。
        request.setHttpPort(8080);
        //最大线程数。
        request.setMaxThreads(20);
        //URI编码方式,支持ISO-8859-1、GBK、GB2312和UTF-8。
        request.setURIEncoding("ISO-8859-1");
        //useBodyEncodingForURI是否启用,true表示启用,false表示不启用。
        request.setUseBodyEncoding(true);

        try {
            UpdateContainerConfigurationResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

Message=success

删除应用实例分组

说明

如果应用实例分组中还存在ECS实例,则无法删除分组。如果您确认要删除分组,请先将ECS实例全部更换分组,具体操作,请参见更换ECS实例的实例分组

以下代码适用于在ECS环境下为应用删除指定应用实例分组。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.DeleteDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.DeleteDeployGroupResponse;

public class DeleteDeployGroup {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //应用所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        DeleteDeployGroupRequest request = new DeleteDeployGroupRequest();
        //指定应用。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //应用中需要删除的应用实例分组的名称。可以调用ListDeployGroup接口查询应用实例分组ID。
        request.setGroupName("Beta");


        try {
            DeleteDeployGroupResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage() + "\nData=" + response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

Message=success
Data=1

结果验证

请根据您执行的操作选择对应的验证方式。

  • 创建应用实例分组。

    您可以调用ListDeployGroup接口查询应用的实例分组列表,根据返回结果中的GroupName参数判断创建应用实例分组是否成功。

    调用ListDeployGroup接口返回的结果如下:

    {
      "DeployGroupList": {
        "DeployGroup": [
          {
            "GroupName": "Beta",
            "AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
            ......
            "GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****"
          }
        ]
      },
      "Message": "success",
      "RequestId": "E8DC196C-F446-4465-A2D1-503728601680",
      "Code": 200
    }
  • 更换ECS实例的实例分组。

    您可以调用ListApplicationEcc接口查询应用的ECC信息,根据返回结果中的GroupIdEccId参数判断将ECS实例更换分组是否成功。

    调用ListApplicationEcc接口返回的结果如下:

    {
      "EccInfoList": {
        "EccInfo": [
          {
            "EcuId": "8287bcf6-cde3-4377-8906-086d2c32****",
            "GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****",
            "AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
            "EccId": "02cdcdfa-f22b-45e6-8a0f-a738c766****",
            ......
          }
        ]
      },
      "Message": "success",
      "RequestId": "763D5FDF-3EC0-4F73-9FB5-A34E22BA9410",
      "Code": 200
    }
  • 为应用实例分组设置JVM。

    您可以调用GetJvmConfiguration接口查询应用实例分组的JVM设置,根据返回结果中的JVM信息判断是否操作成功。

    调用GetJvmConfiguration接口返回结果如下:

    {
      "Message": "success",
      "RequestId": "8EEB65B1-FD4E-4279-A221-09BFB34B9BBF",
      "JvmConfiguration": {
        "Options": "-Dproperty=value",
        "MaxPermSize": 500,
        "MaxHeapSize": 500,
        "MinHeapSize": 500
      },
      "Code": 200
    }
  • 为应用实例分组设置Tomcat。

    调用GetContainerConfiguration接口查询应用实例分组的Tomcat设置,根据返回结果中的Tomcat信息判断是否操作成功。

    调用GetContainerConfiguration接口返回的结果如下:

    {
      "Message": "success",
      "RequestId": "B04B77C9-3978-4A3D-A628-72D385CB7DD3",
      "Code": 200,
      "ContainerConfiguration": {
        "HttpPort": 8080,
        "ContextPath": "ROOT",
        "UseBodyEncoding": true,
        "URIEncoding": "ISO-8859-1",
        "MaxThreads": 20
      }
    }
  • 删除应用实例分组。

    您可以调用ListDeployGroup接口查询应用的实例分组列表,根据返回结果中的GroupName参数判断删除应用实例分组是否成功。

    调用ListDeployGroup接口返回的结果如下:

    {
      "DeployGroupList": {
        "DeployGroup": [
          {
            "GroupName": "_DEFAULT_GROUP",
            "AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
            ......
            "GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****"
          }
        ]
      },
      "Message": "success",
      "RequestId": "E8DC196C-F446-4465-A2D1-503728601680",
      "Code": 200
    }