使用JClouds在Java中获取和发布云服务器
时间:2022-04-22
本文章向大家介绍使用JClouds在Java中获取和发布云服务器,主要内容包括创建计算服务、获取云服务、发布服务器组中的服务器、实现、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
本文中,我们举例来说明如何使用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将您选择的云服务进行了抽象,如果更换其他提供商的云服务,基本上不需要去修改代码。
- CentOS 6.4 + nginx-1.2.5 + php-5.4.15 + MySQL-5.5.31
- 面试问题 - 只用位操作在ABAP里实现a+b
- JAVA 中异常处理的最佳实践
- webpack 4 升级指北
- 对抗蠕虫 —— 如何让按钮不被 JS 自动点击
- 让你的 git 拥有不同身份
- 购物网站的 redis 相关实现(Java)
- Chrome 常用插件 前端-后端-产品
- 更快更安全,HTTPS 优化总结
- Canvas 动画之支付宝价格拖动选择
- 使用 React 和 GraphQL 做一个todo list
- 徒手撸框架---实现 Aop
- 基于 Token 的 WEB 后台认证机制
- TiDB 源码阅读系列文章(二)初识 TiDB 源码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在tinycolinux上组建子目录引导和混合32位64位的rootfs系统
- 微服务中的负载均衡简单实现
- 3分钟短文:素未谋面,Laravel数据库模型初阶入门
- 在tinycolinux上编译seafile
- Alink漫谈(二十一) :回归评估之源码分析
- Linux环境下通过GDB调试C项目实战
- Alink漫谈(二十二) :源码分析之聚类评估
- Python3.x将代码打包成exe程序并添加图标
- 在tinycolinux上编译pypy和hippyvm
- IDEA 热部署配置 HotSwapAgent-IntelliJ-IDEA-plugin
- 在tinycolinux上编译odoo8
- 在tinycolinux上编译jupyter和rootcling组建混合cpp,python学习环境
- 110分钟使用Python搭建自己的IP定位查询接口
- python实现在线微博数据可视化
- 在tinycolinux上安装chrome