使用API金絲雀發(fā)布(ECS集群)
本文介紹如何使用EDAS提供的Java SDK調(diào)用API在EDAS ECS環(huán)境中金絲雀發(fā)布應用。
前提條件
在EDAS ECS環(huán)境中金絲雀發(fā)布應用前,您必須提前完成以下準備工作:
- 安裝EDAS的Java SDK。更多信息,請參見Java SDK接入指南。
確定創(chuàng)建應用的地域,假設為cn-hangzhou。
創(chuàng)建微服務空間。具體操作,請參見創(chuàng)建命名空間。
如果已經(jīng)存在命名空間,您可以調(diào)用ListUserDefineRegion接口查詢用戶自定義命名空間列表,獲取目標命名空間的RegionId。
在ECS集群中創(chuàng)建應用,具體操作,請參見使用API創(chuàng)建應用(ECS)。
如果已經(jīng)創(chuàng)建應用,您可以調(diào)用ListApplication接口查詢應用列表,獲取目標應用的APPId,假設為6bbc57a2-a017-4bec-b521-49a15bd3****。
已將應用部署包(JAR包或WAR包)上傳至目標地址。本示例以OSS存儲路徑為例,假設為https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.1-SNAPSHOT.jar。
請調(diào)用ListDeployGroup接口查詢應用實例分組列表,獲取應用實例分組的GroupId,假設為941be68c-4aac-48a1-88fe-c9ad1502****。
如果需要發(fā)布HSF應用,則需要調(diào)用ListBuildPack接口查詢?nèi)萜靼姹玖斜恚@取容器版本(ConfigId)參數(shù),假設為57。
背景信息
使用API金絲雀發(fā)布應用,在首批灰度發(fā)布后,您必須手動確認繼續(xù)剩余批次的發(fā)布。在確認剩余批次發(fā)布前,您可以進行小規(guī)模驗證,驗證后,再繼續(xù)剩余批次的發(fā)布,即將應用全量升級到新版本。
使用API金絲雀發(fā)布應用,設置剩余批次(除灰度發(fā)布分組外)的發(fā)布方式時推薦選用自動分批發(fā)布。如果您選用手動分批發(fā)布方式,則還需要調(diào)用ContinuePipeline接口手動確認執(zhí)行下一批發(fā)布。
金絲雀發(fā)布應用
運行程序,金絲雀發(fā)布應用。
以下代碼適用于在ECS環(huán)境金絲雀發(fā)布應用。代碼中未設置環(huán)境變量等高級參數(shù),如您需了解更多API參數(shù)信息,請參見DeployApplication。
說明以下代碼適用于分批發(fā)布Spring Cloud和Dubbo應用,如需發(fā)布HSF應用,則需要在代碼中增加EDAS-Container信息:
//EDAS-Container構建包號,當發(fā)布HSF應用時,該參數(shù)必須指定。可以調(diào)用ListBuildPack接口獲取,對應ConfigId參數(shù)。 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的訪問權限,風險很高。強烈建議您創(chuàng)建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創(chuàng)建RAM用戶。 // 此處以把AccessKey和AccessKeySecret保存在環(huán)境變量為例說明。您可以根據(jù)業(yè)務需要,保存到配置文件里。 // 強烈建議不要把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); //創(chuàng)建API請求,并設置參數(shù)。 DeployApplicationRequest request = new DeployApplicationRequest(); //目標應用的AppId。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); //應用描述信息。 request.setDesc("金絲雀發(fā)布"); //部署類型,僅支持設置為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"); //是否為金絲雀發(fā)布,true表示金絲雀,false表示非金絲雀。金絲雀發(fā)布時必須設置分組ID,且后續(xù)分組批次由Batch控制。 request.setGray(true); //金絲雀發(fā)布流量控制策略。示例策略表示:50%的流量會被轉發(fā)到灰度分組。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); //部署分組ID。如果要部署到所有分組,參數(shù)設置為all。金絲雀發(fā)布時必須指定灰度發(fā)布分組的GroupId。 //如果需要部署到具體應用實例分組,可以調(diào)用ListDeployGroup接口獲取GroupId。 request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****"); //灰度發(fā)布后的每組發(fā)布批次,設置為大于1,代表分批發(fā)布。 request.setBatch(2); //分批方式,0表示自動,1表示批次間需要手動確認。建議使用自動發(fā)布方式。 request.setReleaseType((long) 1); //分批等待時間,單位分鐘。默認為0,表示不等待;最大值為5。 request.setBatchWaitTime(1); //應用組件ID。當創(chuàng)建的應用運行環(huán)境使用Apache Tomcat(適用于WAR包部署的Dubbo應用)或者標準Java應用運行環(huán)境(適用于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(); } } }
運行程序,返回的執(zhí)行結果如下所示:
Message=success ChangeOrderId=4a3329de-2495-4c51-be33-f69ff264****
調(diào)用GetChangeOrderInfo接口,獲取金絲雀發(fā)布應用變更的相關批次的流程ID(PipelineId)。
調(diào)用GetChangeOrderInfo接口,返回結果如下:
{ "Message": "success", "RequestId": "0EB98A7D-50CE-4F5F-855D-70BAF61DFB38", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "金絲雀發(fā)布", "PipelineInfoList": { "PipelineInfo": [ { ...... "PipelineId": "09e7d9aa-e79d-49ef-99b9-5405532d****" ...... "PipelineId": "1ea53844-2c60-46f1-b46d-df3b34d0****" ...... "PipelineId": "d99da075-b87d-4fe7-bbb6-ae1c6c26****" ...... //此處未羅列全部執(zhí)行結果,僅供參考。
說明示例代碼的場景是在灰度分組發(fā)布后,剩余分組批次的策略是剩余分2批發(fā)布+手動分批。當灰度分組發(fā)布完成以后,需要手動確認繼續(xù)剩余分組批次的發(fā)布。在調(diào)用GetChangeOrderInfo接口返回結果中出現(xiàn)3個流程ID(PipelineId),第二次出現(xiàn)的流程ID(PipelineId)代表需要手動確認繼續(xù)剩余批次的發(fā)布,第三次出現(xiàn)的流程ID(PipelineId)代表剩余分組批次中第一批完成后需要手動確認繼續(xù)下一批次的發(fā)布。
調(diào)用ContinuePipeline接口,手動確認繼續(xù)剩余分組批次發(fā)布。
返回結果如下:
{ "Message": "success", "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8", "Code": 200 }
調(diào)用ContinuePipeline接口,手動確認下一批發(fā)布。
返回結果如下:
{ "Message": "success", "RequestId": "7BB4F043-7C28-4A0E-B6A5-D4023EB24388", "Code": 200 }
說明示例代碼的場景是在灰度分組發(fā)布后,剩余分組批次的策略是剩余分2批發(fā)布+手動分批。運行到剩余分組批次過程,只需要手動確認一批。如果您是剩余批次需要手動確認多批的場景,請選擇正確批次的流程ID(PipelineId)并重復執(zhí)行此步驟。
結果驗證
您在金絲雀發(fā)布應用后,可以調(diào)用GetChangeOrderInfo接口查看變更流程詳情,獲取金絲雀發(fā)布應用的變更狀態(tài)。具體API參數(shù)詳情,請參見GetChangeOrderInfo。
調(diào)用GetChangeOrderInfo接口查看變更流程詳情,返回的執(zhí)行結果如下:
{
"Message": "success",
"RequestId": "0EB98A7D-50CE-4F5F-855D-70BAF61DFB38",
"Code": 200,
"changeOrderInfo": {
"Status": 2,
"Desc": "金絲雀發(fā)布",
"PipelineInfoList": {
"PipelineInfo": [
{
......
//此處未羅列全部執(zhí)行結果,僅供參考。
請查看上述執(zhí)行結果中的changeOrderInfo.Status參數(shù)值,通過該值判斷金絲雀發(fā)布應用的變更是否成功。changeOrderInfo.Status的取值如下:
0:準備
1:執(zhí)行中
2:執(zhí)行成功
3:執(zhí)行失敗
6:終止
8:手動分批發(fā)布模式下,等待手工確認執(zhí)行下一批。
9:自動分批發(fā)布模式下,等待下一批執(zhí)行中。
10:系統(tǒng)異常執(zhí)行失敗