本文介绍如何使用EDAS提供的Java SDK调用API在EDAS ECS环境中金丝雀发布应用。
前提条件
在EDAS ECS环境中金丝雀发布应用前,您必须提前完成以下准备工作:
- 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南。
确定创建应用的地域,假设为cn-hangzhou。
创建微服务空间。具体操作,请参见创建命名空间。
如果已经存在命名空间,您可以调用ListUserDefineRegion接口查询用户自定义命名空间列表,获取目标命名空间的RegionId。
在ECS集群中创建应用,具体操作,请参见使用API创建应用(ECS)。
如果已经创建应用,您可以调用ListApplication接口查询应用列表,获取目标应用的APPId,假设为6bbc57a2-a017-4bec-b521-49a15bd3****。
已将应用部署包(JAR包或WAR包)上传至目标地址。本示例以OSS存储路径为例,假设为https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.1-SNAPSHOT.jar。
请调用ListDeployGroup接口查询应用实例分组列表,获取应用实例分组的GroupId,假设为941be68c-4aac-48a1-88fe-c9ad1502****。
如果需要发布HSF应用,则需要调用ListBuildPack接口查询容器版本列表,获取容器版本(ConfigId)参数,假设为57。
背景信息
使用API金丝雀发布应用,在首批灰度发布后,您必须手动确认继续剩余批次的发布。在确认剩余批次发布前,您可以进行小规模验证,验证后,再继续剩余批次的发布,即将应用全量升级到新版本。
使用API金丝雀发布应用,设置剩余批次(除灰度发布分组外)的发布方式时推荐选用自动分批发布。如果您选用手动分批发布方式,则还需要调用ContinuePipeline接口手动确认执行下一批发布。
金丝雀发布应用
运行程序,金丝雀发布应用。
以下代码适用于在ECS环境金丝雀发布应用。代码中未设置环境变量等高级参数,如您需了解更多API参数信息,请参见DeployApplication。
说明以下代码适用于分批发布Spring Cloud和Dubbo应用,如需发布HSF应用,则需要在代码中增加EDAS-Container信息:
//EDAS-Container构建包号,当发布HSF应用时,该参数必须指定。可以调用ListBuildPack接口获取,对应ConfigId参数。 request.setBuildPackId(57);
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.DeployApplicationRequest; import com.aliyuncs.edas.model.v20170801.DeployApplicationResponse; public class DeployApplication { 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请求,并设置参数。 DeployApplicationRequest request = new DeployApplicationRequest(); //目标应用的AppId。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); //应用描述信息。 request.setDesc("金丝雀发布"); //部署类型,仅支持设置为url。 request.setDeployType("url"); //应用部署包(WAR或JAR)的URL地址,建议使用OSS存储的应用部署包路径。 request.setWarUrl("https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.1-SNAPSHOT.jar"); //部署的应用部署包版本,最长64个字符,建议使用时间戳。 request.setPackageVersion("20210417.173831"); //是否为金丝雀发布,true表示金丝雀,false表示非金丝雀。金丝雀发布时必须设置分组ID,且后续分组批次由Batch控制。 request.setGray(true); //金丝雀发布流量控制策略。示例策略表示:50%的流量会被转发到灰度分组。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); //部署分组ID。如果要部署到所有分组,参数设置为all。金丝雀发布时必须指定灰度发布分组的GroupId。 //如果需要部署到具体应用实例分组,可以调用ListDeployGroup接口获取GroupId。 request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****"); //灰度发布后的每组发布批次,设置为大于1,代表分批发布。 request.setBatch(2); //分批方式,0表示自动,1表示批次间需要手动确认。建议使用自动发布方式。 request.setReleaseType((long) 1); //分批等待时间,单位分钟。默认为0,表示不等待;最大值为5。 request.setBatchWaitTime(1); //应用组件ID。当创建的应用运行环境使用Apache Tomcat(适用于WAR包部署的Dubbo应用)或者标准Java应用运行环境(适用于JAR包部署的Spring Boot或Spring Cloud应用)时需要指定。 //4代表Apache Tomcat 7.0.91,7代表Apache Tomcat 8.5.42,5代表OpenJDK 1.8.x,6代表OpenJDK 1.7.x。 request.setComponentIds("5"); try { DeployApplicationResponse response = client.getAcsResponse(request); System.out.println("Message=" + response.getMessage() + "\nChangeOrderId=" + response.getChangeOrderId()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
运行程序,返回的执行结果如下所示:
Message=success ChangeOrderId=4a3329de-2495-4c51-be33-f69ff264****
调用GetChangeOrderInfo接口,获取金丝雀发布应用变更的相关批次的流程ID(PipelineId)。
调用GetChangeOrderInfo接口,返回结果如下:
{ "Message": "success", "RequestId": "0EB98A7D-50CE-4F5F-855D-70BAF61DFB38", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "金丝雀发布", "PipelineInfoList": { "PipelineInfo": [ { ...... "PipelineId": "09e7d9aa-e79d-49ef-99b9-5405532d****" ...... "PipelineId": "1ea53844-2c60-46f1-b46d-df3b34d0****" ...... "PipelineId": "d99da075-b87d-4fe7-bbb6-ae1c6c26****" ...... //此处未罗列全部执行结果,仅供参考。
说明示例代码的场景是在灰度分组发布后,剩余分组批次的策略是剩余分2批发布+手动分批。当灰度分组发布完成以后,需要手动确认继续剩余分组批次的发布。在调用GetChangeOrderInfo接口返回结果中出现3个流程ID(PipelineId),第二次出现的流程ID(PipelineId)代表需要手动确认继续剩余批次的发布,第三次出现的流程ID(PipelineId)代表剩余分组批次中第一批完成后需要手动确认继续下一批次的发布。
调用ContinuePipeline接口,手动确认继续剩余分组批次发布。
返回结果如下:
{ "Message": "success", "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8", "Code": 200 }
调用ContinuePipeline接口,手动确认下一批发布。
返回结果如下:
{ "Message": "success", "RequestId": "7BB4F043-7C28-4A0E-B6A5-D4023EB24388", "Code": 200 }
说明示例代码的场景是在灰度分组发布后,剩余分组批次的策略是剩余分2批发布+手动分批。运行到剩余分组批次过程,只需要手动确认一批。如果您是剩余批次需要手动确认多批的场景,请选择正确批次的流程ID(PipelineId)并重复执行此步骤。
结果验证
您在金丝雀发布应用后,可以调用GetChangeOrderInfo接口查看变更流程详情,获取金丝雀发布应用的变更状态。具体API参数详情,请参见GetChangeOrderInfo。
调用GetChangeOrderInfo接口查看变更流程详情,返回的执行结果如下:
{
"Message": "success",
"RequestId": "0EB98A7D-50CE-4F5F-855D-70BAF61DFB38",
"Code": 200,
"changeOrderInfo": {
"Status": 2,
"Desc": "金丝雀发布",
"PipelineInfoList": {
"PipelineInfo": [
{
......
//此处未罗列全部执行结果,仅供参考。
请查看上述执行结果中的changeOrderInfo.Status参数值,通过该值判断金丝雀发布应用的变更是否成功。changeOrderInfo.Status的取值如下:
0:准备
1:执行中
2:执行成功
3:执行失败
6:终止
8:手动分批发布模式下,等待手工确认执行下一批。
9:自动分批发布模式下,等待下一批执行中。
10:系统异常执行失败