日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AutoScaling 与函数计算结合,赋予更丰富的弹性能力

發(fā)布時(shí)間:2023/11/29 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AutoScaling 与函数计算结合,赋予更丰富的弹性能力 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目前,彈性伸縮服務(wù)已經(jīng)接入了負(fù)載均衡(SLB)、云數(shù)據(jù)庫RDS 等云產(chǎn)品,但是暫未接入 云數(shù)據(jù)庫Redis,有時(shí)候我們可能會(huì)需要彈性伸縮服務(wù)在擴(kuò)縮容的時(shí)候自動(dòng)將擴(kuò)縮容涉及到的 ECS 實(shí)例私網(wǎng) IP 添加到 Redis 白名單或者從 Redis 白名單中移除。本文將給出上述場(chǎng)景的最佳實(shí)踐,向您介紹如何通過 AutoSclaing -> LifecycleHook -> MNS -> FC 的方式實(shí)現(xiàn)伸縮組發(fā)生擴(kuò)容時(shí)自動(dòng)將擴(kuò)容出來的 ECS 實(shí)例私網(wǎng) IP 添加到 Redis 白名單中,您可以在此基礎(chǔ)上,根據(jù)您的業(yè)務(wù)需求進(jìn)行擴(kuò)展。

函數(shù)計(jì)算(FC)簡(jiǎn)介

阿里云函數(shù)計(jì)算是事件驅(qū)動(dòng)的全托管計(jì)算服務(wù)。通過函數(shù)計(jì)算,您無需管理服務(wù)器等基礎(chǔ)設(shè)施,只需編寫代碼并上傳。函數(shù)計(jì)算會(huì)為您準(zhǔn)備好計(jì)算資源,以彈性、可靠的方式運(yùn)行您的代碼,并提供日志查詢、性能監(jiān)控、報(bào)警等功能。借助于函數(shù)計(jì)算,您可以快速構(gòu)建任何類型的應(yīng)用和服務(wù),無需管理和運(yùn)維。而且,您只需要為代碼實(shí)際運(yùn)行所消耗的資源付費(fèi),代碼未運(yùn)行則不產(chǎn)生費(fèi)用。更多關(guān)于函數(shù)計(jì)算的相關(guān)信息,您可以通過 函數(shù)計(jì)算官方文檔 進(jìn)行了解。

消息服務(wù)(MNS)簡(jiǎn)介

阿里云消息服務(wù)(Message Service,簡(jiǎn)稱 MNS)是一種高效、可靠、安全、便捷、可彈性擴(kuò)展的分布式消息服務(wù)。MNS能夠幫助應(yīng)用開發(fā)者在他們應(yīng)用的分布式組件上自由的傳遞數(shù)據(jù)、通知消息,構(gòu)建松耦合系統(tǒng)。更多關(guān)于消息服務(wù)的相關(guān)信息,您可以通過 消息服務(wù)官方文檔 進(jìn)行了解。

最佳實(shí)踐

前提條件

在進(jìn)行以下操作前,您需要先開通 函數(shù)計(jì)算服務(wù)FC 、 消息服務(wù)MNS 、彈性伸縮服務(wù)AutoScaling,接下來配置我們需要用的 FC、MNS、AutoScaling 相關(guān)信息

配置 MNS

登錄 MNS控制臺(tái),創(chuàng)建 MNS 主題(作為函數(shù)計(jì)算的觸發(fā)器),如下圖所示:

同樣的,創(chuàng)建 MNS 隊(duì)列,MNS 隊(duì)列作為函數(shù)計(jì)算執(zhí)行結(jié)果接收器,隊(duì)列名稱會(huì)在代碼中進(jìn)行配置。

配置 FC

登錄FC控制臺(tái),新建服務(wù),如下圖所示:

服務(wù)創(chuàng)建好以后,新增函數(shù),如下圖所示:

點(diǎn)擊新增函數(shù),彈出新建函數(shù)對(duì)話框,如下圖所示:

選擇函數(shù)語言,并選擇空白模板,跳轉(zhuǎn)到觸發(fā)器配置界面,如下圖所示:

配置好觸發(fā)器類型、觸發(fā)器名稱以及對(duì)應(yīng)的 MNS 主題(MNS 主題與 FC 所屬的地域最好相同),點(diǎn)擊下一步,跳轉(zhuǎn)到基礎(chǔ)管理配置界面,如下圖所示:


所在服務(wù)默認(rèn)會(huì)選擇當(dāng)前服務(wù),不用改變,填寫函數(shù)名稱,選擇運(yùn)行環(huán)境,通過代碼包上傳的方式上傳提前測(cè)試好的 java jar包(即觸發(fā)函數(shù)計(jì)算時(shí)需要執(zhí)行的運(yùn)行的程序,本文最后會(huì)給出示例jar包),按照說明填寫好函數(shù)入口,點(diǎn)擊下一步,跳轉(zhuǎn)到模版授權(quán)管理界面,如下圖所示:


首先授予函數(shù)運(yùn)行所需要的權(quán)限,授權(quán)時(shí)候應(yīng)遵循權(quán)限最小化原則,防止權(quán)限過大,如上圖步驟1、2所示,再授予 MNS 觸發(fā) FC 所需的權(quán)限,如上圖步驟3、4所示,最后點(diǎn)擊下一步,跳轉(zhuǎn)到信息核對(duì)界面,如下圖所示:

核對(duì)信息無誤,點(diǎn)擊創(chuàng)建,函數(shù)創(chuàng)建完成。

關(guān)于函數(shù)計(jì)算的配置過程,您可以通過 FC Hello World示例 進(jìn)行了解。

創(chuàng)建云數(shù)據(jù)庫 Redis

登錄 Redis控制臺(tái),選擇和 MNS 、FC 相同的地域,創(chuàng)建 Redis 實(shí)例。實(shí)例創(chuàng)建完以后,查看實(shí)例的白名單設(shè)置,如下圖所示:

配置 AutoScaling

登錄 彈性伸縮控制臺(tái),創(chuàng)建好伸縮組以及伸縮配置以后,創(chuàng)建生命周期掛鉤(LifecycleHook),如下圖所示:

上圖中,在左側(cè)導(dǎo)航欄選擇生命周期掛鉤,點(diǎn)擊創(chuàng)建生命周期掛鉤按鈕,填寫名稱,選擇生命周期掛鉤對(duì)應(yīng)的伸縮活動(dòng)類型,配置生命周期掛鉤對(duì)應(yīng)的 MNS 通知為 MNS 主題,并且選擇的主題為 FC 觸發(fā)器對(duì)應(yīng)的主題,最后點(diǎn)擊創(chuàng)建按鈕,生命周期掛鉤函數(shù)創(chuàng)建完成,如下圖所示:

在伸縮組發(fā)生擴(kuò)容伸縮活動(dòng)時(shí),實(shí)例創(chuàng)建完成并運(yùn)行起來以后,生命周期掛鉤會(huì)被觸發(fā),并發(fā)送伸縮活動(dòng)相關(guān)信息到生命周期掛鉤配置的 MNS 主題上,掛起當(dāng)前的伸縮活動(dòng),直到生命周期掛鉤超時(shí)或者被提前結(jié)束。生命周期掛鉤活動(dòng)結(jié)束以后,伸縮活動(dòng)繼續(xù)執(zhí)行,擴(kuò)容出來的 ECS 實(shí)例會(huì)被掛載到負(fù)載均衡實(shí)例上(如果伸縮組配置了負(fù)載均衡實(shí)例的話)。關(guān)于生命周期掛鉤功能的詳細(xì)說明,您可以通過云棲博客 AutoScaling 生命周期掛鉤功能 進(jìn)行詳細(xì)了解。

觸發(fā)擴(kuò)容伸縮活動(dòng)

首先,我們通過觸發(fā)擴(kuò)容伸縮活動(dòng)的方式,創(chuàng)建 10 臺(tái) ECS 實(shí)例,對(duì)應(yīng)的伸縮活動(dòng)如下圖所示:

然后我們登錄 MNS控制臺(tái),查看隊(duì)列接收到的 FC 執(zhí)行結(jié)果消息,如下圖所示:

上述消息中 success 為 true,表示函數(shù)計(jì)算執(zhí)行成功(即 ECS 實(shí)例私網(wǎng) IP 添加到 Redis 白名單成功),消息體中還包括了當(dāng)前生命周期掛鉤活動(dòng)對(duì)應(yīng)的 LifecycleHookId LifecycleActionToken 參數(shù)信息,您可以根據(jù)相關(guān)參數(shù)信息調(diào)用 CompleteLifecycleAction 接口提前結(jié)束生命周期活動(dòng)。

最后,我們登錄 云數(shù)據(jù)庫Redis控制臺(tái),查看當(dāng)前的 Redis 白名單信息,如下圖所示:

從上圖可以看出,彈性伸縮擴(kuò)容活動(dòng)創(chuàng)建出來的 ECS 實(shí)例私網(wǎng) IP 成功添加到 Redis 白名單中。

至此,通過 AutoScaling -> LifecycleHook -> MNS -> FC 實(shí)現(xiàn) Redis 白名單自動(dòng)添加的過程結(jié)束,整體過程如下:

  • 彈性伸縮組觸發(fā)擴(kuò)容伸縮活動(dòng),擴(kuò)容 ECS 實(shí)例,擴(kuò)容活動(dòng)觸發(fā)生命周期掛鉤
  • 生命周期掛鉤將擴(kuò)容活動(dòng)掛起,同時(shí)發(fā)送消息到 MNS 主題
  • MNS 主題接收到消息以后將消息作為輸入信息觸發(fā) FC,FC 被觸發(fā)以后執(zhí)行預(yù)置業(yè)的 JAVA 函數(shù)
  • JAVA 函數(shù)獲取 FC 觸發(fā)器的輸入信息,信息中包括了本次伸縮活動(dòng)對(duì)應(yīng)的 ECS 實(shí)例 ID信息,通過接口獲取 ECS 實(shí)例私網(wǎng) IP 以后添加到 Redis default 分組白名單中
  • 最后,函數(shù)執(zhí)行結(jié)果發(fā)送到代碼中配置好的 MNS 隊(duì)列中
  • 上述過程僅作為一個(gè)參考的 Demo,進(jìn)一步實(shí)現(xiàn)自動(dòng)化管理,還需要我們自己編程實(shí)現(xiàn),如編程的方式消費(fèi) MNS 隊(duì)列中的消息,獲取執(zhí)行結(jié)果與 LifecycleHookId LifecycleActionToken等參數(shù)信息提前結(jié)束生命周期掛鉤活動(dòng)等。

    FC 預(yù)置 JAVA 代碼解析

    FC 預(yù)置函數(shù)為 JAVA 代碼,通過 Maven 管理,對(duì)應(yīng)的代碼及依賴如下:

    Example.java

    package fc;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; import com.aliyun.mns.model.Message; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsRequest; import com.aliyuncs.r_kvstore.model.v20150101.DescribeSecurityIpsResponse; import com.aliyuncs.r_kvstore.model.v20150101.ModifySecurityIpsRequest; import model.FCResult; import model.HookModel; import model.MnsMessageModel; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.springframework.util.CollectionUtils;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Example implements StreamRequestHandler {/*** 專有網(wǎng)絡(luò)類型,此參數(shù)不用變*/private static final String VPC_NETWORK = "vpc";private static final String CHAR_SET = "UTF-8";/*** 接收input數(shù)組大小,4096通常夠用*/private static final Integer MAX_BYTE_LENGTH = 4096;/*** REDIS 白名單默認(rèn)分組*/private static final String DEFAULT_SECURITY_GROUP_NAME = "default";/*** REDIS 修改白名單的模式*/private static final String MODIFY_MODE_APPEND = "Append";/*** MNS 客戶端發(fā)送消息地址*/private static final String MNS_END_POINT = "http://%s.mns.%s.aliyuncs.com/";/*** 待添加的REDIS實(shí)例ID,根據(jù)個(gè)人情況替換*/private static final String REDIS_ID = "";/*** 接收本次函數(shù)計(jì)算執(zhí)行結(jié)果的隊(duì)列名稱,根據(jù)個(gè)人情況替換*/private static final String QUEUE_NAME = "wujin-fc-callback";/*** 阿里云賬號(hào)UID,根據(jù)跟人情況替換*/private static final Long USER_ID = 1111111111111111111L;/*** 伸縮組 MNS FC 所屬的region,根據(jù)個(gè)人情況替換*/private static final String REGION_ID = "cn-hangzhou";@Overridepublic void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {FCResult result = new FCResult();String akId = context.getExecutionCredentials().getAccessKeyId();String akSecret = context.getExecutionCredentials().getAccessKeySecret();String securityToken = context.getExecutionCredentials().getSecurityToken();try {//獲取MNS觸發(fā)函數(shù)計(jì)算時(shí)輸入的內(nèi)容String input = readInput(inputStream);MnsMessageModel mnsMessageModel = JSON.parseObject(input,new TypeReference<MnsMessageModel>() {});if (mnsMessageModel == null) {result.setSuccess(false);result.setMessage("mnsMessageModel is null");sendMns(akId, akSecret, securityToken, result.toString());return;}HookModel contentModel = mnsMessageModel.getContent();if (contentModel == null) {result.setSuccess(false);result.setMessage("contentModel is null");sendMns(akId, akSecret, securityToken, result.toString());return;}IAcsClient client = buildClient(akId, akSecret, securityToken);//獲取本次伸縮活動(dòng)對(duì)應(yīng)實(shí)例的私網(wǎng)IPList<String> privateIps = getInstancesPrivateIps(contentModel.getInstanceIds(), client);if (CollectionUtils.isEmpty(privateIps)) {result.setSuccess(false);result.setMessage("privateIps is empty");sendMns(akId, akSecret, securityToken, result.toString());return;}List<String> needAppendIps = filterPrivateIpsForAppend(privateIps, client);if (!CollectionUtils.isEmpty(needAppendIps)) {modifySecurityIps(client, needAppendIps);result.setLifecycleHookId(contentModel.getLifecycleHookId());result.setLifecycleActionToken(contentModel.getLifecycleActionToken());sendMns(akId, akSecret, securityToken, result.toString());}} catch (Exception ex) {result.setSuccess(false);result.setMessage(ex.getMessage());sendMns(akId, akSecret, securityToken, result.toString());}}/*** 構(gòu)建請(qǐng)求 ECS Redis 接口客戶端** @param akId* @param akSecret* @param securityToken* @return*/private IAcsClient buildClient(String akId, String akSecret, String securityToken) {IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, akId, akSecret,securityToken);return new DefaultAcsClient(clientProfile);}/*** 將執(zhí)行結(jié)果發(fā)送消息到MNS** @param ak* @param aks* @param securityToken* @param msg*/private void sendMns(String ak, String aks, String securityToken, String msg) {MNSClient client = null;try {CloudAccount account = new CloudAccount(ak, aks,String.format(MNS_END_POINT, USER_ID, REGION_ID), securityToken);client = account.getMNSClient();CloudQueue queue = client.getQueueRef(QUEUE_NAME);Message message = new Message();message.setMessageBody(msg);queue.putMessage(message);} finally {if (client != null) {client.close();}}}/*** 過濾出需要添加到redis的私網(wǎng)IP** @param privateIps 過濾以前的私網(wǎng)IP* @param client* @return* @throws ClientException*/private List<String> filterPrivateIpsForAppend(List<String> privateIps, IAcsClient client)throws ClientException {List<String> needAppendIps = new ArrayList<>();if (CollectionUtils.isEmpty(privateIps)) {return needAppendIps;}DescribeSecurityIpsRequest request = new DescribeSecurityIpsRequest();request.setInstanceId(REDIS_ID);DescribeSecurityIpsResponse response = client.getAcsResponse(request);List<DescribeSecurityIpsResponse.SecurityIpGroup> securityIpGroups = response.getSecurityIpGroups();if (CollectionUtils.isEmpty(securityIpGroups)) {return privateIps;}for (DescribeSecurityIpsResponse.SecurityIpGroup securityIpGroup : securityIpGroups) {if (!securityIpGroup.getSecurityIpGroupName().equals(DEFAULT_SECURITY_GROUP_NAME)) {continue;}String securityIps = securityIpGroup.getSecurityIpList();if (securityIps == null) {continue;}String[] securityIpList = securityIps.split(",");List<String> existIps = Arrays.asList(securityIpList);if (CollectionUtils.isEmpty(existIps)) {continue;}for (String ip : privateIps) {if (!existIps.contains(ip)) {needAppendIps.add(ip);}}}return privateIps;}/*** 修改REDIS實(shí)例DEFAULT分組私網(wǎng)IP白名單** @param client* @param needAppendIps* @throws ClientException*/private void modifySecurityIps(IAcsClient client, List<String> needAppendIps)throws ClientException {if (CollectionUtils.isEmpty(needAppendIps)) {return;}ModifySecurityIpsRequest request = new ModifySecurityIpsRequest();request.setInstanceId(REDIS_ID);String ip = StringUtils.join(needAppendIps.toArray(), ",");request.setSecurityIps(ip);request.setSecurityIpGroupName(DEFAULT_SECURITY_GROUP_NAME);request.setModifyMode(MODIFY_MODE_APPEND);client.getAcsResponse(request);}/*** 獲取輸入,并base64解碼** @param inputStream* @return* @throws IOException*/private String readInput(InputStream inputStream) throws IOException {try {byte[] bytes = new byte[MAX_BYTE_LENGTH];int tmp;int len = 0;//循環(huán)讀取所有內(nèi)容while ((tmp = inputStream.read()) != -1 && len < MAX_BYTE_LENGTH) {bytes[len] = (byte) tmp;len++;}inputStream.close();byte[] act = new byte[len];System.arraycopy(bytes, 0, act, 0, len);return new String(Base64.decodeBase64(act), CHAR_SET);} finally {inputStream.close();}}/*** 獲取實(shí)例列表對(duì)應(yīng)的私網(wǎng)IP,并限制每次請(qǐng)求實(shí)例數(shù)量不超過100** @param instanceIds 實(shí)例列表* @param client 請(qǐng)求客戶端* @return* @throws Exception*/public List<String> getInstancesPrivateIps(List<String> instanceIds, IAcsClient client)throws Exception {List<String> privateIps = new ArrayList<>();if (CollectionUtils.isEmpty(instanceIds)) {return privateIps;}int size = instanceIds.size();int queryNumberPerTime = 100;int batchCount = (int) Math.ceil((float) size / (float) queryNumberPerTime);//support 100 instancefor (int i = 1; i <= batchCount; i++) {int fromIndex = queryNumberPerTime * (i - 1);int toIndex = Math.min(queryNumberPerTime * i, size);List<String> subList = instanceIds.subList(fromIndex, toIndex);DescribeInstancesRequest request = new DescribeInstancesRequest();request.setInstanceIds(JSON.toJSONString(subList));DescribeInstancesResponse response = client.getAcsResponse(request);List<DescribeInstancesResponse.Instance> instances = response.getInstances();if (CollectionUtils.isEmpty(instances)) {continue;}for (DescribeInstancesResponse.Instance instance : instances) {String privateIp = getPrivateIp(instance);if (privateIp != null) {privateIps.add(privateIp);}}}return privateIps;}/*** 從 DescribeInstancesResponse.Instance 中解析出私網(wǎng) IP** @param instance DescribeInstancesResponse.Instance*/private String getPrivateIp(DescribeInstancesResponse.Instance instance) {String privateIp = null;if (VPC_NETWORK.equalsIgnoreCase(instance.getInstanceNetworkType())) {DescribeInstancesResponse.Instance.VpcAttributes vpcAttributes = instance.getVpcAttributes();if (vpcAttributes != null) {List<String> privateIpAddress = vpcAttributes.getPrivateIpAddress();if (!CollectionUtils.isEmpty(privateIpAddress)) {privateIp = privateIpAddress.get(0);}}} else {List<String> innerIpAddress = instance.getInnerIpAddress();if (!CollectionUtils.isEmpty(innerIpAddress)) {privateIp = innerIpAddress.get(0);}}return privateIp;} }

    代碼中涉及到的 Model 文件

    FCResult.java

    package model;import com.alibaba.fastjson.JSON;public class FCResult {private boolean success = true;private String lifecycleHookId;private String lifecycleActionToken;private String message;public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getLifecycleHookId() {return lifecycleHookId;}public void setLifecycleHookId(String lifecycleHookId) {this.lifecycleHookId = lifecycleHookId;}public String getLifecycleActionToken() {return lifecycleActionToken;}public void setLifecycleActionToken(String lifecycleActionToken) {this.lifecycleActionToken = lifecycleActionToken;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return JSON.toJSONString(this);} }

    HookModel.java

    package model;import java.util.List;public class HookModel {private String lifecycleHookId;private String lifecycleActionToken;private String lifecycleHookName;private String scalingGroupId;private String scalingGroupName;private String lifecycleTransition;private String defaultResult;private String requestId;private String scalingActivityId;private List<String> instanceIds;public String getLifecycleHookId() {return lifecycleHookId;}public void setLifecycleHookId(String lifecycleHookId) {this.lifecycleHookId = lifecycleHookId;}public String getLifecycleActionToken() {return lifecycleActionToken;}public void setLifecycleActionToken(String lifecycleActionToken) {this.lifecycleActionToken = lifecycleActionToken;}public String getLifecycleHookName() {return lifecycleHookName;}public void setLifecycleHookName(String lifecycleHookName) {this.lifecycleHookName = lifecycleHookName;}public String getScalingGroupId() {return scalingGroupId;}public void setScalingGroupId(String scalingGroupId) {this.scalingGroupId = scalingGroupId;}public String getScalingGroupName() {return scalingGroupName;}public void setScalingGroupName(String scalingGroupName) {this.scalingGroupName = scalingGroupName;}public String getLifecycleTransition() {return lifecycleTransition;}public void setLifecycleTransition(String lifecycleTransition) {this.lifecycleTransition = lifecycleTransition;}public String getDefaultResult() {return defaultResult;}public void setDefaultResult(String defaultResult) {this.defaultResult = defaultResult;}public String getRequestId() {return requestId;}public void setRequestId(String requestId) {this.requestId = requestId;}public String getScalingActivityId() {return scalingActivityId;}public void setScalingActivityId(String scalingActivityId) {this.scalingActivityId = scalingActivityId;}public List<String> getInstanceIds() {return instanceIds;}public void setInstanceIds(List<String> instanceIds) {this.instanceIds = instanceIds;} }

    MnsMessageModel.java

    package model;public class MnsMessageModel {private String userId;private String regionId;private String resourceArn;private HookModel content;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getRegionId() {return regionId;}public void setRegionId(String regionId) {this.regionId = regionId;}public String getResourceArn() {return resourceArn;}public void setResourceArn(String resourceArn) {this.resourceArn = resourceArn;}public HookModel getContent() {return content;}public void setContent(HookModel content) {this.content = content;} }

    Maven 依賴

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.aliyun.fc.wujin</groupId><artifactId>demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-ecs</artifactId><version>4.10.1</version></dependency><dependency><groupId>com.aliyun.fc.runtime</groupId><artifactId>fc-java-core</artifactId><version>1.0.0</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>3.2.6</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-r-kvstore</artifactId><version>2.0.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.25</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>com.springsource.org.apache.commons.lang</artifactId><version>2.6.0</version></dependency><dependency><groupId>com.aliyun.mns</groupId><artifactId>aliyun-sdk-mns</artifactId><version>1.1.8.4</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><appendAssemblyId>false</appendAssemblyId> <!-- this is used for not append id to the jar name --></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- bind to the packaging phase --><goals><goal>single</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

    上述java文件中,Example.java 文件在包名為 fc 的目錄下,FCResult.java HookModel.java MnsMessageModel.java 三個(gè)文件在包名為 model 的目錄下,package fc 與 package model 處于同級(jí)目錄。
    Example.java 文件需要根據(jù)實(shí)際情況對(duì)相關(guān)參數(shù)進(jìn)行替換,QUEUE_NAME 參數(shù)定義了接收函數(shù)執(zhí)行結(jié)果的 MNS 隊(duì)列,我們?cè)?配置 MNS 章節(jié)已經(jīng)提前創(chuàng)建好了。
    參數(shù)替換完成以后,可以參考 FC Java 編程說明 重新打包并上傳您的 jar 包即可,上傳方法如下圖所示:

    寫在最后

    通過 AutoScaling -> LifecycleHook -> MNS -> FC 的方式,您可以具備更加豐富的彈性能力,從而更加靈活地管理您伸縮組內(nèi)的資源。

    上述代碼僅供參考,具體實(shí)現(xiàn)需要結(jié)合具體業(yè)務(wù)進(jìn)行測(cè)試改造。

    總結(jié)

    以上是生活随笔為你收集整理的AutoScaling 与函数计算结合,赋予更丰富的弹性能力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。