创建与管理无保护期抢占式实例

本示例介绍如何使用Alibaba Cloud SDK for Java创建与管理无保护期抢占式实例。

前提条件

在使用本教程之前,请确保已完成以下操作:

  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面查看您的访问密钥。

  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)

    <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>java.demo</groupId>
        <artifactId>test</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-ecs</artifactId>
                <version>4.19.12</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>4.6.1</version>
            </dependency>
        </dependencies>
    </project>

示例代码

本文操作示例主要以代码形式体现,具体代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.SimpleTimeZone;

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.ecs.model.v20140526.DescribeSpotPriceHistoryRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeSpotPriceHistoryResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeSpotPriceHistoryResponse.SpotPriceType;
import com.aliyuncs.ecs.model.v20140526.RunInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.RunInstancesResponse;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.profile.DefaultProfile;
import org.apache.commons.lang.time.DateUtils;

/**
 * 无保护期抢占式实例代码样例
 */
public class NoDurationSpotSample {

    public static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String GMT = "GMT";

    static String regionNo = "cn-beijing";
    static String izNo = "cn-beijing-h";
    static String instanceType = "ecs.g5.8xlarge";

    public static void main(String[] args) {
        IAcsClient client = Initialization();
        describeSpotPriceHistory(client);
        describeSpotCurrentPrice(client);
        createSpotInstance(client);
        describeSpotInstance(client);
    }

    /**
     * <pre>
     *     查看实例是否是无保护期抢占式实例
     *     参照 <a href="https://help.aliyun.com/document_detail/25506.html">OpenAPI DescribeInstances</a>
     * </pre>
     *
     * @param client
     */
    private static void describeSpotInstance(IAcsClient client) {
        try {
            List<String> instanceIds = new ArrayList<String>();
            instanceIds.add("<your-instance-id>");
            DescribeInstancesRequest request = new DescribeInstancesRequest();
            request.setRegionId(regionNo);
            request.setInstanceIds(JSON.toJSONString(instanceIds));
            request.setAcceptFormat(FormatType.JSON);
            DescribeInstancesResponse response = client.getAcsResponse(request);
            if (null != response.getInstances() && response.getInstances().size() > 0) {
                Integer spotDuration = response.getInstances().get(0).getSpotDuration();
                if (spotDuration != null && 0 == spotDuration) {
                    System.out.println("该实例是无保护期类型的抢占式实例");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * <pre>
     * 创建无保护期抢占式实例
     * 参照 <a href="https://help.aliyun.com/document_detail/63440.html">OpenAPI RunInstances</a>
     * </pre>
     *
     * @param client
     */
    private static void createSpotInstance(IAcsClient client) {
        try {
            RunInstancesRequest request = new RunInstancesRequest();
            request.setVSwitchId("<your-vsw-id>");
            request.setImageId("<your-image-id>");
            request.setSecurityGroupId("<your-security-group-id>");
            request.setSystemDiskCategory("<your-disk-category>"); // 系统盘类型, 例如 "cloud_ssd"
            request.setSystemDiskSize("<your-disk-size>"); // 系统盘大小, 例如 "40"
            request.setInstanceType(instanceType);
            request.setAmount(1);
            request.setAcceptFormat(FormatType.JSON);
            request.setInstanceChargeType("PostPaid");
            request.setSpotStrategy("SpotAsPriceGo");
            request.putQueryParameter("SpotDuration", 0);
            RunInstancesResponse acsResponse = client.getAcsResponse(request);
            if (null == acsResponse.getInstanceIdSets() || acsResponse.getInstanceIdSets().isEmpty()) {
                return;
            }
            List<String> instanceIdSets = acsResponse.getInstanceIdSets();
            System.out.println("创建成功. 实例ID列表: " + instanceIdSets);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取当前抢占式实例的收费价格
     *
     * @param client
     */
    private static void describeSpotCurrentPrice(IAcsClient client) {
        try {
            DescribeSpotPriceHistoryRequest request = new DescribeSpotPriceHistoryRequest();
            request.setRegionId(regionNo);
            request.setZoneId(izNo);
            request.setInstanceType(instanceType);
            request.setIoOptimized("optimized");
            request.setNetworkType("vpc");
            String oneDayAgo = formatIso8601Date(DateUtils.addDays(Calendar.getInstance().getTime(), -1));
            request.setStartTime(oneDayAgo);
            //request.putQueryParameter("SpotDuration", 0);
            request.setSpotDuration(0);
            request.setAcceptFormat(FormatType.JSON);
            DescribeSpotPriceHistoryResponse acsResponse = client.getAcsResponse(request);
            if (acsResponse.getSpotPrices() == null || acsResponse.getSpotPrices().isEmpty()) {
                System.out.println("询价失败");
                return;
            }
            // 打印每个时间戳对应的价格信息
            SpotPriceType currentSpotPriceType = acsResponse.getSpotPrices().get(
                acsResponse.getSpotPrices().size() - 1);
            System.out.println("当前抢占式实例价格: " + currentSpotPriceType.getSpotPrice());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * <pre>
     * 获取近一天的抢占式实例市场价格
     * 参照 <a href="https://help.aliyun.com/document_detail/60400.html">OpenAPI DescribeSpotPriceHistory</a>
     * </pre>
     *
     * @param client
     */
    private static void describeSpotPriceHistory(IAcsClient client) {
        try {
            DescribeSpotPriceHistoryRequest request = new DescribeSpotPriceHistoryRequest();
            request.setRegionId(regionNo);
            request.setZoneId(izNo);
            request.setInstanceType(instanceType);
            request.setIoOptimized("optimized");
            request.setNetworkType("vpc");
            String oneDayAgo = formatIso8601Date(DateUtils.addDays(Calendar.getInstance().getTime(), -1));
            request.setStartTime(oneDayAgo);
            //request.putQueryParameter("SpotDuration", 0);
            request.setSpotDuration(0);
            request.setAcceptFormat(FormatType.JSON);
            DescribeSpotPriceHistoryResponse acsResponse = client.getAcsResponse(request);
            if (acsResponse.getSpotPrices() == null || acsResponse.getSpotPrices().isEmpty()) {
                return;
            }
            // 打印每个时间戳对应的价格信息
            for (SpotPriceType spotPrice : acsResponse.getSpotPrices()) {
                String iso8601GmtDate = spotPrice.getTimestamp();
                Date date = parseGMT2LocalDate(iso8601GmtDate);
                String dateStr = new SimpleDateFormat(DATE_FORMAT).format(date);
                System.out.println(
                    "日期: " + dateStr + " 原价: " + spotPrice.getOriginPrice() + " 抢占式实例价格: " + spotPrice.getSpotPrice());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将Date类型转换成ISO8601标准表示, 并使用UTC +0时间, 格式为yyyy-MM-ddTHH:mm:ssZ
     *
     * @param date
     * @return
     */
    public static String formatIso8601Date(Date date) {
        SimpleDateFormat rfc822DateFormat = new SimpleDateFormat(ISO8601_DATE_FORMAT, Locale.US);
        rfc822DateFormat.setTimeZone(new SimpleTimeZone(0, GMT));
        return rfc822DateFormat.format(date);
    }

    /**
     * @param iso8601GmtDate ISO8601格式的gmt时间
     * @throws ParseException
     */
    public static Date parseGMT2LocalDate(String iso8601GmtDate) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        simpleDateFormat.setTimeZone(SimpleTimeZone.getTimeZone(GMT));
        return simpleDateFormat.parse(iso8601GmtDate);
    }

    /**
     * Initialization  初始化公共请求参数
     */
    private static IAcsClient Initialization() {
        // 初始化请求参数
        DefaultProfile profile = DefaultProfile.getProfile(
            regionNo,                       // 您的地域ID
            "<your-access-key-id>",         // 您的AccessKey ID
            "<your-access-key-secret>");    // 您的AccessKey Secret
        return new DefaultAcsClient(profile);
    }
}

相关链接

阿里云首页 阿里云SDK 相关技术圈