本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Rackspace)协同工作并且允许使用Java代码执行大量操作。换句话说,JClouds API不是针对某些提供商所特定接口去进行交互。下面我们以Rackspace所提供的云服务为例进行说明。
首先为JClouds获取jar。如果您使用的是Maven,依赖关系如下所示。在操作之前,请先检查版本是否需要更新。
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-allcompute</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-sshj</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-log4j</artifactId>
<version>1.5.1</version>
</dependency
创建一个名为“CloudService”的类。在它的在构造函数中,设置好接口信息,如用户名、API秘钥等信息,最后将这个类实例化。
package co.syntx.examples.jclouds;
import static org.jclouds.compute.predicates.NodePredicates.inGroup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.jclouds.ContextBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;
public class CloudService {
private ComputeService compute;
private String location;
public static final Logger logger = Logger.getLogger(CloudService.class);
/**
* CloudService类构造器
* 需要明确云服务供应商提供的字符串,数据库位置,用户名,API秘钥。
* @param provider
* @param location
* @param username
* @param apiKey
*/
public CloudService(String provider, String location, String username, String apiKey) {
this.location = location;
ComputeServiceContext context = ContextBuilder.newBuilder(provider).credentials(username, apiKey)
.buildView(ComputeServiceContext.class);
compute = context.getComputeService();
logger.info("Cloud Compute Service Context Created");
}
接下来写一个获取云服务的功能,其中主要的参数如下:
groupName:如果要获取多个服务器,则所有服务器都需要以groupName作为前缀,以便识别和分类。
OS:操作系统的名称
osVersion:操作系统的版本
RAM:RAM的大小
count:所需的云服务器数量
/**
* 通过指定参数获取服务器
* @param groupName
* @param os
* @param osVersion
* @param ram
* @param count
* @throws Exception
*/
public void aquireServer(String groupName, String os, String osVersion, Integer ram, Integer count) throws Exception {
TemplateBuilder templateBuilder = compute.templateBuilder();
Template template = templateBuilder
.locationId(this.location)
.os64Bit(true)
.osDescriptionMatches(os)
.osVersionMatches(osVersion)
.minRam(ram)
.build();
logger.info("Acquiring "+ count+ " server(s).");
Set<? extends NodeMetadata> nodes = compute.createNodesInGroup(groupName,count, template);
logger.info(nodes.size() + " server(s) acquired!");
}
我们可以一次发布一个或一组服务器。下面代码可以发布服务器组:
public void releaseGroup(String groupName) throws Exception {
logger.info("Releasing server(s) from group " + groupName);
Set<? extends NodeMetadata> servers = compute.destroyNodesMatching(inGroup(groupName));
logger.info(servers.size() + " released from group " + groupName);
}
最后,我们对类进行实例化并传入一组参数,调用获取云服务的功能。在调用之前,rackspace控制面板如下:
rackspace 控制面板
CloudService cloudService = new CloudService("rackspace-cloudservers-us","DFW", "yourUsername", "yourAPIKey");
cloudService.aquireServer("my-test-servers","Ubuntu","12.04",512,2);
在成功获取服务器之前,再调用这个功能都会被阻塞。阻塞过程中,控制面板会像图中所示:
图片.png
最后,调用服务器发布功能进行发布。
cloudService.releaseGroup("my-test-servers");
这就是JClouds使用的简例。JClouds库提供了很多强大的功能。最重要的就是JClouds将您选择的云服务进行了抽象,如果更换其他提供商的云服务,基本上不需要去修改代码。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。