使用API管理ECS集群中的應(yīng)用實例分組
本文介紹如何使用EDAS提供的Java SDK調(diào)用API管理ECS集群中的應(yīng)用實例分組。
前提條件
在管理ECS集群中的應(yīng)用實例分組前,您必須提前完成以下準備工作:
- 安裝EDAS的Java SDK。更多信息,請參見Java SDK接入指南。
確定應(yīng)用所在地域,假設(shè)為cn-hangzhou。
創(chuàng)建應(yīng)用實例分組前,請先調(diào)用ListHistoryDeployVersion接口查詢應(yīng)用部署的歷史版本列表,獲取目標版本的唯一標識(PackageVersion.Id)。
更換分組前,請先調(diào)用ListApplicationEcc接口查詢應(yīng)用的ECC信息,獲取目標ECS實例的ECC ID(EccId)。
創(chuàng)建ECS實例。假設(shè)為i-bp13o01lzmbsvhsl****和i-bp13o01lzmbsvhsl****。
創(chuàng)建ECS集群,具體操作,請參見使用API創(chuàng)建ECS集群。
如果您已經(jīng)創(chuàng)建了ECS集群,則可以調(diào)用ListCluster接口查詢集群列表,獲取目標ECS集群的集群ID(ClusterId),假設(shè)為369d06d7-450b-4f3d-bf75-9536fcd9****。
背景信息
實例分組,指的是將應(yīng)用中ECS實例進行分組,以便在不同分組中部署不同版本的應(yīng)用。您可以通過實例分組進行流量管理和灰度發(fā)布。
例如:應(yīng)用itemcenter一共部署了10個ECS實例,將這些實例分為兩個組,分別為默認分組和Beta分組。其中默認分組包含6個實例,Beta分組包含4個實例。此時應(yīng)用就擁有了兩個實例分組,可以分別部署不同的應(yīng)用版本。
- 每個應(yīng)用在創(chuàng)建的時候,EDAS默認會為應(yīng)用創(chuàng)建“默認分組”,該分組不可刪除。
- 如果沒有流量管理或灰度發(fā)布等多版本部署需求,通常使用這個“默認分組”就足夠了,不需要新建其他分組。
- 部署應(yīng)用時,優(yōu)先采用應(yīng)用分組的JVM參數(shù)、Tomcat、實例啟動模板以及SLB等配置信息。
創(chuàng)建應(yīng)用實例分組
以下代碼適用于在ECS環(huán)境為指定應(yīng)用創(chuàng)建應(yīng)用實例分組。
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的訪問權(quán)限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。
// 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務(wù)需要,保存到配置文件里。
// 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。
String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
//應(yīng)用所在地域ID。
String region_id = "cn-hangzhou";
DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
DefaultAcsClient client = new DefaultAcsClient(defaultProfile);
//創(chuàng)建API請求,并設(shè)置參數(shù)。
InsertDeployGroupRequest request = new InsertDeployGroupRequest();
//指定應(yīng)用,在該應(yīng)用中創(chuàng)建應(yīng)用實例分組。
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
//自定義新建的應(yīng)用實例分組名稱,支持設(shè)置為中文、字母、數(shù)字、下劃線(_)和半角句號(.),最長64個字符。
request.setGroupName("Beta");
//應(yīng)用分組關(guān)聯(lián)的初始化部署包版本ID,可以調(diào)用接口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();
}
}
}
運行程序,返回的執(zhí)行結(jié)果如下所示:
GroupName=Beta
Id=941be68c-4aac-48a1-88fe-c9ad1502****
更換ECS實例的實例分組
更換應(yīng)用中ECS實例到其他應(yīng)用實例分組時,只能一次更換一個ECS實例到其他分組。
以下代碼適用于在ECS環(huán)境下將指定應(yīng)用的ECS實例更換到其他應(yīng)用實例分組。
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的訪問權(quán)限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。
// 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務(wù)需要,保存到配置文件里。
// 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。
String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
//應(yīng)用所在地域ID。
String region_id = "cn-hangzhou";
DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
DefaultAcsClient client = new DefaultAcsClient(defaultProfile);
//創(chuàng)建API請求,并設(shè)置參數(shù)。
ChangeDeployGroupRequest request = new ChangeDeployGroupRequest();
//指定應(yīng)用,將應(yīng)用中的ECS實例更換應(yīng)用實例分組。
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
//指定要切換應(yīng)用分組的ECS實例的ECC ID。可以調(diào)用ListApplicationEcc接口查詢應(yīng)用的ECC ID。
request.setEccInfo("4009a824-ce33-4ba0-9ca2-346249a9****");
//目標應(yīng)用分組名稱,如果需要更換到默認分組,則設(shè)置為_DEFAULT_GROUP。
request.setGroupName("Beta");
//ECC的部署包版本和應(yīng)用分組的部署包版本不一致時是否強制更換。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();
}
}
}
運行程序,返回的執(zhí)行結(jié)果如下所示:
Message=success
ChangeOrderId=369d06d7-450b-4f3d-bf75-9536fcd9****
為應(yīng)用實例分組設(shè)置JVM
以下代碼適用于在ECS環(huán)境下為應(yīng)用實例分組設(shè)置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的訪問權(quán)限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。
// 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務(wù)需要,保存到配置文件里。
// 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。
String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
//應(yīng)用所在地域ID。
String region_id = "cn-hangzhou";
DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
DefaultAcsClient client = new DefaultAcsClient(defaultProfile);
//創(chuàng)建API請求,并設(shè)置參數(shù)。
UpdateJvmConfigurationRequest request = new UpdateJvmConfigurationRequest();
//指定應(yīng)用,為應(yīng)用中的應(yīng)用實例分組設(shè)置JVM參數(shù)。
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
//指定要設(shè)置JVM參數(shù)的應(yīng)用實例分組的ID。可以調(diào)用ListDeployGroup接口查詢應(yīng)用實例分組ID。
request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
//自定義參數(shù)。
request.setOptions("-Dproperty=value");
//初始化堆內(nèi)存大小,單位MB。
request.setMinHeapSize(500);
//持久代內(nèi)存大小,單位MB。
request.setMaxPermSize(500);
//最大堆內(nèi)存大小,單位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();
}
}
}
運行程序,返回的執(zhí)行結(jié)果如下所示:
Message=success
為應(yīng)用實例分組設(shè)置Tomcat
以下代碼適用于在ECS環(huán)境下為應(yīng)用實例分組設(shè)置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的訪問權(quán)限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。
// 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務(wù)需要,保存到配置文件里。
// 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。
String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
//應(yīng)用所在地域ID。
String region_id = "cn-hangzhou";
DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
DefaultAcsClient client = new DefaultAcsClient(defaultProfile);
//創(chuàng)建API請求,并設(shè)置參數(shù)。
UpdateContainerConfigurationRequest request = new UpdateContainerConfigurationRequest();
//指定應(yīng)用,為應(yīng)用中的應(yīng)用實例分組設(shè)置Tomcat。
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
//指定要設(shè)置Tomcat參數(shù)的應(yīng)用實例分組的ID。可以調(diào)用ListDeployGroup接口查詢應(yīng)用實例分組ID。
request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
//Tomcat的ContextPath,支持空字符串、null-war包名稱、ROOT-根目錄或其他非空自定義字符串。
request.setContextPath("");
//應(yīng)用端口。
request.setHttpPort(8080);
//最大線程數(shù)。
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();
}
}
}
運行程序,返回的執(zhí)行結(jié)果如下所示:
Message=success
刪除應(yīng)用實例分組
如果應(yīng)用實例分組中還存在ECS實例,則無法刪除分組。如果您確認要刪除分組,請先將ECS實例全部更換分組,具體操作,請參見更換ECS實例的實例分組。
以下代碼適用于在ECS環(huán)境下為應(yīng)用刪除指定應(yīng)用實例分組。
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的訪問權(quán)限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。
// 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務(wù)需要,保存到配置文件里。
// 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。
String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
//應(yīng)用所在地域ID。
String region_id = "cn-hangzhou";
DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
DefaultAcsClient client = new DefaultAcsClient(defaultProfile);
//創(chuàng)建API請求,并設(shè)置參數(shù)。
DeleteDeployGroupRequest request = new DeleteDeployGroupRequest();
//指定應(yīng)用。
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
//應(yīng)用中需要刪除的應(yīng)用實例分組的名稱。可以調(diào)用ListDeployGroup接口查詢應(yīng)用實例分組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();
}
}
}
運行程序,返回的執(zhí)行結(jié)果如下所示:
Message=success
Data=1
結(jié)果驗證
請根據(jù)您執(zhí)行的操作選擇對應(yīng)的驗證方式。
創(chuàng)建應(yīng)用實例分組。
您可以調(diào)用ListDeployGroup接口查詢應(yīng)用的實例分組列表,根據(jù)返回結(jié)果中的GroupName參數(shù)判斷創(chuàng)建應(yīng)用實例分組是否成功。
調(diào)用ListDeployGroup接口返回的結(jié)果如下:
{ "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實例的實例分組。
您可以調(diào)用ListApplicationEcc接口查詢應(yīng)用的ECC信息,根據(jù)返回結(jié)果中的GroupId和EccId參數(shù)判斷將ECS實例更換分組是否成功。
調(diào)用ListApplicationEcc接口返回的結(jié)果如下:
{ "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 }
為應(yīng)用實例分組設(shè)置JVM。
您可以調(diào)用GetJvmConfiguration接口查詢應(yīng)用實例分組的JVM設(shè)置,根據(jù)返回結(jié)果中的JVM信息判斷是否操作成功。
調(diào)用GetJvmConfiguration接口返回結(jié)果如下:
{ "Message": "success", "RequestId": "8EEB65B1-FD4E-4279-A221-09BFB34B9BBF", "JvmConfiguration": { "Options": "-Dproperty=value", "MaxPermSize": 500, "MaxHeapSize": 500, "MinHeapSize": 500 }, "Code": 200 }
為應(yīng)用實例分組設(shè)置Tomcat。
調(diào)用GetContainerConfiguration接口查詢應(yīng)用實例分組的Tomcat設(shè)置,根據(jù)返回結(jié)果中的Tomcat信息判斷是否操作成功。
調(diào)用GetContainerConfiguration接口返回的結(jié)果如下:
{ "Message": "success", "RequestId": "B04B77C9-3978-4A3D-A628-72D385CB7DD3", "Code": 200, "ContainerConfiguration": { "HttpPort": 8080, "ContextPath": "ROOT", "UseBodyEncoding": true, "URIEncoding": "ISO-8859-1", "MaxThreads": 20 } }
刪除應(yīng)用實例分組。
您可以調(diào)用ListDeployGroup接口查詢應(yīng)用的實例分組列表,根據(jù)返回結(jié)果中的GroupName參數(shù)判斷刪除應(yīng)用實例分組是否成功。
調(diào)用ListDeployGroup接口返回的結(jié)果如下:
{ "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 }