云服务平台仿真-身份认证/授权/申请和释放IT资源[云计算3]

实验名称

云服务平台仿真--身份认证/授权/申请和释放IT资源

实验目的

  1. 通过CloudSim仿真,熟悉云服务平台的构建。
  2. 通过CloudSim仿真,熟悉各种云机制在云服务中的实现原理。

实验原理

CloudSim可以模拟云服务的各类底层方法。在省略技术细节的前提下, 可以实现一个人机交互界面,通过调用CloudSim的库函数来模拟一个 能够满足云用户申请和使用IT资源的云服务平台(功能参考阿里云平台)。

实验要求

开发一个基于CloudSim仿真的云服务平台,并至少实现以下功能:

  1. 界面:使用JSP等Web开发技术实现B/S架构的云平台(云用户使用浏览器访问云平台); 或者使用Java Console模式实现单机版云平台(云用户使用命令提示符窗口通过交互命令来访问云平台)。
  2. 身份认证:需要有账户登录和验证功能,能够实现多租户使用云平台。
  3. 授权:不同类型的用户拥有不同的权限。
  4. 申请和释放IT资源:申请和释放各类IT资源(CPU、内存、硬盘、带宽、......)。
  5. 其他功能:其他功能不限数量,均记为加分项。

源码:功能不全,比较简陋,而且释放资源的时候还会报错。

复制代码
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 对象之前,确保其存在。

相关推荐
花千烬1 天前
crictl info 连不上 containerd 怎么办?endpoint、socket 与权限一次查清
云计算
AKAMAI4 天前
每百万 Token 成本砍六成,出海 AI 团队开始重算推理这笔账
人工智能·云计算
tiancaijiben17 天前
阿里云Kubernetes集群托管完全指南:从创建到生产级运维
云计算
互联网推荐官17 天前
上海软件定制开发公司推荐:从PaaS工程化路径看D-coding的技术取舍
云原生·云计算·paas·软件开发·开发经验·上海
sbjdhjd17 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins
tiancaijiben17 天前
阿里云应用实时监控服务ARMS完全接入指南:从探针部署到全链路可观测
云计算
xingyuzhisuan18 天前
算力租赁平台 GPU 资源隔离方案:显存抢占问题深度排查与解决
大数据·云计算·gpu算力
workbuddy小能手18 天前
腾讯云ADP Agent Portal vs 自建智能体:架构选型对比
架构·云计算·腾讯云
宸津-代码粉碎机18 天前
Spring AI 企业级实战|智能记忆摘要+自动遗忘机制落地,彻底解决上下文爆炸与Token冗余
java·大数据·人工智能·后端·python·spring·云计算