实验名称
云服务平台仿真--身份认证/授权/申请和释放IT资源
实验目的
- 通过CloudSim仿真,熟悉云服务平台的构建。
- 通过CloudSim仿真,熟悉各种云机制在云服务中的实现原理。
实验原理
CloudSim可以模拟云服务的各类底层方法。在省略技术细节的前提下, 可以实现一个人机交互界面,通过调用CloudSim的库函数来模拟一个 能够满足云用户申请和使用IT资源的云服务平台(功能参考阿里云平台)。
实验要求
开发一个基于CloudSim仿真的云服务平台,并至少实现以下功能:
- 界面:使用JSP等Web开发技术实现B/S架构的云平台(云用户使用浏览器访问云平台); 或者使用Java Console模式实现单机版云平台(云用户使用命令提示符窗口通过交互命令来访问云平台)。
- 身份认证:需要有账户登录和验证功能,能够实现多租户使用云平台。
- 授权:不同类型的用户拥有不同的权限。
- 申请和释放IT资源:申请和释放各类IT资源(CPU、内存、硬盘、带宽、……)。
- 其他功能:其他功能不限数量,均记为加分项。
源码:功能不全,比较简陋,而且释放资源的时候还会报错。
package org.cloudbus.cloudsim;
import java.util.HashMap;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class zzf {
private static Map<String, List<Vm>> VMmap = new HashMap<>();
// 查看并打印与给定ID关联的用户下的所有IT资源(虚拟机由Vm类表示),接受一个字符串参数ID
private static void viewResources(String ID){
List<Vm> vmlist; //声明了一个Vm类型的列表 vmlist,用于存储与给定 ID 关联的虚拟机
//检查VMmap中的用户ID
if(VMmap.get(ID) == null) { //VMmap中没有和ID关联的列表
vmlist = new ArrayList<Vm>(); //创建新的空Vm列表
VMmap.put(ID,vmlist); //将该列表与ID存取在VMmap中
System.out.println( ID +",此用户暂无任何IT资源---------\n");
} else {
//从VMmap中获取与ID关联的Vm列表
vmlist = VMmap.get(ID);
}
//遍历并打印虚拟机信息 使用迭代器遍历vmlist中的每一个Vm对象
for (Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
Vm vm = iterator.next();
System.out.println("当前用户" + ID + "编号为" + vm.getId() + "的虚拟机!!");
System.out.println("-------------------------------------------------");
System.out.println("用户的宽带 :" + vm.getBw() + "Mbps");
System.out.println("用户的CPU数量:" + vm.getNumberOfPes());
System.out.println("用户的内存:" + vm.getRam() + "MB");
System.out.println("\n");
}
}
// 申请各类IT资源
public static void applyResource(String ID) {
Scanner sc = new Scanner(System.in);
List<Vm> vmlist;
String num = null;
if(VMmap.get(ID) == null){
vmlist = new ArrayList<Vm>();
VMmap.put(ID,vmlist);
} else {
vmlist = VMmap.get(ID);
}
System.out.println("选择默认参数,输入1:");
if(sc.hasNext()){
num = sc.next();
}
// VM 对象
long ram = 2048; // RAM 容量(MB)
long bw = 100; //带宽Mbps()
int pesNumber = 1;// PE 数量
if(num.equals("1")){
System.out.println("默认申请的规格具体如下:");
System.out.println("----------------------------------------");
System.out.println("CPU个数: "+ pesNumber);
System.out.println("内存 :"+ram+"MB");
System.out.println("带宽 :"+bw +"Mbps");
System.out.println("----------------------------------------");
}
}
// 释放vmID的IT资源
public static void releaseRes(String ID, String vmID) {
Scanner sc = new Scanner(System.in);
String choice = null;
List<Vm> vmlist = VMmap.get(ID);
Vm vm = null;
for(Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
vm = iterator.next();
if((vm.getId() + "").equals(vmID)) break;
}
tar: while (true) {
System.out.println("您想要释放哪些IT资源?");
System.out.println("输入0: 返回");
System.out.println("输入数字1: 带宽");
System.out.println("输入数字2: 内存");
System.out.println("输入数字3: 存储空间");
System.out.println("请选择:");
if(sc.hasNext()){
choice = sc.next();
}
long ramSize = vm.getRam();
if(choice.equals("3")) {
System.out.println(vmID+"号虚拟机一共有"+vm.getSize()+"MB"+"想要释放多少存储空间?");
long num1 = sc.nextLong();
num1 = vm.getSize() - num1;
vm.setSize(num1);
} else if (choice.equals("2")){
System.out.println(vmID+"号虚拟机一共有"+ramSize+"MB"+"想要释放多少内存空间?");
int num2 = sc.nextInt();
num2 = vm.getRam() - num2;
vm.setRam(num2);
} else if (choice.equals("1")) {
System.out.println(vmID+"号虚拟机一共有"+ vm.getBw()+"M"+"想要释放多少带宽?");
} else if (choice.equals("0")) {
break tar;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Log.printLine("Starting zzf...");
while (true) {
System.out.println("请输入用户ID进行操作或输入'exit'退出:");
String userID = scanner.nextLine();
if (userID.equals("exit")) {
break;
}
System.out.println("选择操作:\n1. 查看IT资源\n2. 申请IT资源\n3. 释放IT资源\n请输入选项:");
String choice = scanner.nextLine();
switch (choice) {
case "1":
viewResources(userID);
break;
case "2":
applyResource(userID);
break;
case "3":
System.out.println("请输入要释放的虚拟机ID:");
String vmID = scanner.nextLine();
releaseRes(userID, vmID);
break;
default:
System.out.println("无效的选项,请重新输入.");
}
}
Log.printLine("zzf finished!");
scanner.close();
}
}
报错位置:释放资源功能
报错信息:Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.cloudbus.cloudsim.Vm.getRam()" because "vm" is null。
chatGPT给出的建议:
通常表示你尝试访问一个尚未被初始化或已设为
null
的对象的方法或属性。从你提供的错误信息来看,可能是在某个地方尝试访问一个未成功创建或未正确引用的Vm
实例的 RAM。错误可能出现在处理
releaseResources
方法中,尝试访问已删除或未找到的Vm
对象。为了避免这个问题,我们需要在尝试访问Vm
对象之前,确保其存在。