如果您是开发者,可参考本文提供的Alibaba Cloud SDK for Java示例查询某一地域下有库存的抢占式实例规格。
前提条件
- 已准备阿里云账号以及对应的访问密钥(AccessKey)。
使用Alibaba Cloud SDK for Java时需要设置阿里云账号的AccessKey信息。AccessKey的获取方式,请参见创建AccessKey。
- 已在开发环境中安装Java SDK。您需要在Maven项目中添加以下依赖。具体操作,请参见安装Java SDK。
<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>4.23.10</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.0.8</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency> </dependencies>
代码示例
本文操作示例主要以代码形式体现,具体代码如下:
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone.AvailableResource;
import com.aliyuncs.ecs.model.v20140526.DescribeAvailableResourceResponse.AvailableZone.AvailableResource.SupportedResource;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeZonesResponse.Zone;
import com.aliyuncs.profile.DefaultProfile;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
public class QuerySpotAvailableResource {
private static IAcsClient client;
/**请将regionId修改为您想要查询的regionId*/
private static String regionId = "cn-hangzhou";
public static void main(String[] args) {
client = Initialization();
/**请将instanceType修改为您想要查询的实例规格*/
String instanceType = "ecs.n2.3xlarge";
/**请将cores修改为您想要查询的内核数*/
Integer cores = 4;
/**请将memory修改为您想要查询的实例规格的内存大小,单位为GiB*/
Float memory = 8f;
//指定地域,查询该地域下所有可用区有库存的抢占式实例规格
describeRegionAvailableResource();
//指定规格,查询该地域是否有库存
describeInstanceTypeAvailableResource(instanceType);
//指定内核数目内存大小,查询当前地域所有可用区中符合条件的有库存的实例规格
describeCoresMemoryAvailableResource(cores, memory);
}
public static void describeRegionAvailableResource(){
try {
Map<String, List<String>> spotAvailableResource= Maps.newHashMap();
List<String> zones = describeZones();
zones.stream().forEach(zone->{
List<String> instanceTypes = describeAvailableResource(zone, null, 0, 0f);
if (CollectionUtils.isNotEmpty(instanceTypes)) {
spotAvailableResource.put(zone, instanceTypes);
}
});
System.out.println(spotAvailableResource);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void describeInstanceTypeAvailableResource(String instanceType){
List<String> list = Lists.newArrayList();
try {
List<String> zones = describeZones();
zones.stream().forEach(zone->{
List<String> instanceTypes = describeAvailableResource(zone, instanceType, 0, 0f);
if (CollectionUtils.isNotEmpty(instanceTypes)){
list.add(zone);
}
});
if (CollectionUtils.isNotEmpty(list)){
System.out.println("有库存的可用区: " + JSON.toJSONString(list));
}else {
System.out.println("当前地域无库存");
}
} catch (Exception e){
e.printStackTrace();
}
}
public static void describeCoresMemoryAvailableResource(Integer cores, Float memory) {
Map<String, List<String>> spotAvailableResource= Maps.newHashMap();
try {
List<String> zones = describeZones();
zones.stream().forEach(zone -> {
List<String> instanceTypes = describeAvailableResource(zone, null, cores, memory);
if (CollectionUtils.isNotEmpty(instanceTypes)) {
spotAvailableResource.put(zone, instanceTypes);
}
});
System.out.println(spotAvailableResource);
}catch (Exception e){
e.printStackTrace();
}
}
public static List<String> describeZones() throws Exception {
DescribeZonesRequest request = new DescribeZonesRequest();
request.setSysRegionId(regionId);
request.setSpotStrategy("SpotAsPriceGo");
DescribeZonesResponse response = client.getAcsResponse(request);
List<Zone> zones = response.getZones();
List<String> zoneList = Lists.newArrayList();
zones.stream().forEach(zone -> {
zoneList.add(zone.getZoneId());
});
return zoneList;
}
public static List<String> describeAvailableResource(String zoneId, String instanceType, Integer cores, Float memory) {
DescribeAvailableResourceRequest request = new DescribeAvailableResourceRequest();
request.setSysRegionId(regionId);
request.setZoneId(zoneId);
request.setDestinationResource("InstanceType");
request.setSpotStrategy("SpotAsPriceGo");
if (StringUtils.isNotBlank(instanceType)){
request.setInstanceType(instanceType);
}
if (0 != cores){
request.setCores(cores);
}
if (0 != memory){
request.setMemory(memory);
}
List<String> instanceTypes = Lists.newArrayList();
try {
DescribeAvailableResourceResponse response = client.getAcsResponse(request);
List<AvailableZone> availableZones = response.getAvailableZones();
availableZones.stream().forEach(availableZone -> {
List<AvailableResource> availableResources = availableZone.getAvailableResources();
availableResources.stream().forEach(availableResource -> {
List<SupportedResource> supportedResources = availableResource.getSupportedResources();
supportedResources.stream().forEach(supportedResource -> {
if ("Available".equals(supportedResource.getStatus()) && "WithStock".equals(supportedResource.getStatusCategory())){
instanceTypes.add(supportedResource.getValue());
}
});
});
});
} catch (Exception e) {
e.printStackTrace();
}
return instanceTypes;
}
private static IAcsClient Initialization() {
// 初始化请求参数
DefaultProfile profile = DefaultProfile.getProfile(
regionId, // 您的地域ID
"<your-access-key-id>", // 您的AccessKey ID
"<your-access-key-secret>"); // 您的AccessKey Secret
return new DefaultAcsClient(profile);
}
}
查询结果的返回示例,如下图所示,表示在杭州地域下符合需求的有库存的实例规格有ecs.i2.xlarge、ecs.d1-c8d3.8xlarge等。
