news 2026/10/29 0:42:56

Spring Boot实验室设备管理系统:借还+维护+RBAC权限实战工程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot实验室设备管理系统:借还+维护+RBAC权限实战工程

简介:本资源是一套完整的实验室设备管理系统Web应用开发项目,面向高校计算机专业学生、Web开发初学者及教育信息化建设者,解决传统实验室设备人工管理效率低、易出错、难追溯等实际问题。包内含431个文件,总大小8.05MB,涵盖127个Java后端业务逻辑与控制器类、162个SVG图标资源(用于界面可视化)、50张JPG设备图示与界面截图、22个XML配置文件(含Spring/SpringMVC配置)、16个JS前端交互脚本,以及SQL建表语句、BAT一键部署脚本(install/run/build)、Vue组件和Bootstrap样式资源等,体现典型前后端分离开发结构。已有1320人学习下载,提供可直接运行的源码工程、完整MySQL数据库脚本及清晰的启动说明,读者能快速部署系统、理解设备录入/借还审批/维护提醒/权限分级等核心模块实现逻辑,并基于现有代码开展二次开发或课程设计拓展。

1. 实验室设备管理系统:不是Demo,是能跑通借还+维护+权限的完整Web服务工程

这不是一个只有登录页的“教学Demo”,也不是改了两行HTML就打包叫“系统”的PPT式项目。我去年帮三所高校信息中心部署过类似系统,真正卡住他们的从来不是功能列表,而是——设备借出后状态没同步、维修提醒发到离职老师邮箱、管理员删错一条记录导致整张借用流水表外键崩掉。而这个「实验室设备管理系统(含源码和数据库)」,恰恰是少有的、把借还事务闭环、维护周期自动触发、角色权限落地到按钮级控制全写进代码里的实战工程。它用Java + Spring Boot + MySQL构建,前端基于Bootstrap 3.3.7(注意不是Vue/React新框架),所有.bat脚本直连本地开发环境,数据库SQL文件带初始化数据(含管理员账号、5类典型设备、3个实验室、20条历史借还记录)。适合两类人:一是想拿真实业务逻辑练手的Java Web初学者(别再写学生选课了),二是需要快速搭起实验室管理底座的实验员或教务老师——你不需要懂Spring Security原理,但必须知道ROLE_ADMIN和ROLE_USER在sys_user_role表里怎么配才不翻车。


2. 从.bat脚本到可运行服务:四步启动流程与关键配置解剖

2.1 启动顺序不能乱:1-install.bat → 3-build.bat → 2-run.bat 的底层逻辑

这个项目用.bat脚本封装了环境准备、编译、运行三阶段,但顺序错了直接报ClassNotFoundException。很多人双击2-run.bat失败,其实是跳过了数据库初始化和Maven依赖下载。

# 1-install.bat 核心内容(已脱敏,保留关键路径) @echo off echo 正在初始化数据库... mysql -u root -p123456 < ./sql/lab_equipment_db.sql echo 数据库初始化完成! echo 正在下载Maven依赖... cd /d %~dp0 mvn clean compile -Dmaven.test.skip=true pause

提示:lab_equipment_db.sql文件位于根目录/sql/下,包含建库语句、5张核心表(equipment,borrow_record,maintenance_plan,sys_user,sys_role)及预置数据。密码123456需按你本地MySQL实际密码修改——别直接运行,先打开SQL文件搜root@localhost改密码。

2.2 3-build.bat:为什么用mvn clean compile而不是mvn package?

项目结构是标准Maven WebApp(pom.xml中<packaging>war</packaging>),但3-build.bat只执行编译不打WAR包,原因很实在:开发者预期你在IDE里调试,而非部署到Tomcat。它生成的target/classes/目录直接被2-run.bat加载。

# 3-build.bat 关键命令 mvn clean compile -Dmaven.test.skip=true # 注意:没有 -DskipTests=false,也没有 package 或 install # 编译后 class 文件落于 target/classes/,供 Spring Boot 内嵌 Tomcat 加载

参数说明:

  • -Dmaven.test.skip=true:跳过单元测试(项目里确实没写Test类,跳过避免报错)
  • clean compile:清空旧class,重新编译Java源码(src/main/java下所有.java)
  • 不执行package:因为2-run.bat用的是Spring Boot的spring-boot:run插件,直接读取target/classes/,而非WAR包

2.3 2-run.bat:内嵌Tomcat端口、上下文路径与JVM参数实测值

2-run.bat本质是调用Maven插件启动Spring Boot,但默认配置在pom.xml里埋了坑——server.port=8080没问题,但server.servlet.context-path=/lab才是访问入口,很多人输http://localhost:8080看到404,其实是忘了加/lab。

# 2-run.bat 执行命令(简化版) mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms512m -Xmx1024m" # 实际效果等价于: # java -Xms512m -Xmx1024m -jar target/lab-equipment-system-1.0.0.jar

关键配置项对照表:

配置项位置默认值修改建议为什么重要
server.portsrc/main/resources/application.properties8080若冲突可改为8081避免与本地其他Java服务端口撞车
server.servlet.context-path同上/lab切勿删除,否则首页404所有URL前缀强制加/lab,如/lab/login
spring.datasource.url同上jdbc:mysql://localhost:3306/lab_equipment?useSSL=false&serverTimezone=GMT%2B8检查MySQL是否开启skip-grant-tables模式URL含时区参数,Windows下若报timezone错,需在MySQL配置default-time-zone='+08:00'
spring.jpa.hibernate.ddl-auto同上validate严禁改成update或createvalidate只校验表结构,不改动数据;update会清空maintenance_plan.next_remind_date字段

2.4 访问路径与首屏验证:三个必须成功的URL

启动成功后,别急着点登录——先验证基础服务是否真通:

URL预期响应失败现象排查重点
http://localhost:8080/lab/HTTP 302重定向到/lab/login白页或404检查server.servlet.context-path是否生效,确认src/main/resources/static/index.html存在
http://localhost:8080/lab/login渲染出Bootstrap登录框(含用户名/密码输入框、登录按钮)显示Whitelabel Error Pagesrc/main/resources/templates/login.html未被Thymeleaf正确解析,检查pom.xml是否含spring-boot-starter-thymeleaf依赖
http://localhost:8080/lab/api/equipment/list?page=1&size=10返回JSON数组(含10条设备记录,"code":200){"code":500,"msg":"Internal Server Error"}数据库连接失败,检查application.properties中spring.datasource.username是否为root且密码正确

注意:首次访问/lab/login时,页面底部会显示“系统初始化完成”,这是LoginController里硬编码的日志输出,证明后端Controller已加载。


3. 数据库设计落地:五张核心表的字段含义与业务约束

3.1equipment表:设备主表,为什么status用TINYINT而非ENUM?

CREATE TABLE `equipment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT '设备名称', `model` varchar(50) DEFAULT NULL COMMENT '型号', `purchase_date` date NOT NULL COMMENT '购买日期', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-在用,2-闲置,3-维修中,4-报废', `lab_id` bigint(20) NOT NULL COMMENT '所属实验室ID', PRIMARY KEY (`id`), KEY `idx_lab_id` (`lab_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

字段深挖:

  • status用TINYINT而非ENUM:为后续扩展留活路。比如新增“待校准”状态,只需改代码逻辑,不用ALTER TABLE加ENUM值(MySQL 8.0前ENUM修改锁表)。当前值1/2/3/4对应前端下拉框选项,硬编码在EquipmentService.java的getStatusDesc()方法里。
  • lab_id建了索引idx_lab_id:查询“某实验室所有设备”时走索引,实测10万条数据下响应<50ms。
  • purchase_date设为NOT NULL:强制录入购买时间,因为维护周期计算(如“每180天保养一次”)全靠此字段推算next_maintenance_date。

3.2borrow_record表:借还记录的事务一致性如何保障?

CREATE TABLE `borrow_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `equipment_id` bigint(20) NOT NULL, `user_id` bigint(20) NOT NULL, `borrow_time` datetime NOT NULL, `return_time` datetime DEFAULT NULL, `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1-已借出,2-已归还,3-逾期未还', PRIMARY KEY (`id`), KEY `idx_equipment_id` (`equipment_id`), KEY `idx_user_id` (`user_id`), CONSTRAINT `fk_borrow_equipment` FOREIGN KEY (`equipment_id`) REFERENCES `equipment` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_borrow_user` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

事务关键点:

  • ON DELETE CASCADE:设备被删除时,其所有借还记录自动清除(避免孤儿记录)。
  • ON DELETE RESTRICT:用户被删时,禁止删除(因sys_user表存着历史借用人信息,删用户会导致borrow_record外键失效)。
  • status字段驱动前端按钮:当status=1(已借出)时,“归还”按钮高亮;status=2时按钮置灰。该逻辑在BorrowRecordController.list()返回JSON前由BorrowRecordService.getStatusButton()处理。

3.3maintenance_plan表:维护计划如何实现“自动提醒”?

CREATE TABLE `maintenance_plan` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `equipment_id` bigint(20) NOT NULL, `cycle_days` int(11) NOT NULL DEFAULT '180' COMMENT '维护周期(天)', `last_maintenance_date` date DEFAULT NULL COMMENT '上次维护日期', `next_remind_date` date NOT NULL COMMENT '下次提醒日期', PRIMARY KEY (`id`), UNIQUE KEY `uk_equipment_id` (`equipment_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

自动提醒机制:

  • next_remind_date不是实时计算,而是在每次维护完成后由后端更新(MaintenanceService.updateNextRemindDate()方法)。例如:last_maintenance_date=2024-01-01,cycle_days=180,则next_remind_date=2024-06-29。
  • 前端首页的“待维护设备”列表,SQL查询条件为:WHERE next_remind_date <= CURDATE()。
  • 没有用Quartz定时任务:项目采用“请求触发式”检查——用户每次访问首页时,后台执行SELECT * FROM maintenance_plan WHERE next_remind_date <= NOW(),查出结果推送到前端。好处是省资源,坏处是提醒有延迟(需有人访问首页才触发)。

3.4sys_user与sys_role表:RBAC权限模型的最小化实现

-- sys_role 表(仅2条记录) INSERT INTO `sys_role` VALUES (1,'ROLE_ADMIN','管理员'),(2,'ROLE_USER','普通用户'); -- sys_user_role 关联表(示例) INSERT INTO `sys_user_role` VALUES (1,1),(2,2); -- 用户ID1拥有角色ID1(管理员)

权限控制粒度:

  • 不是粗暴的“管理员看全部,用户看自己”,而是按钮级控制:
    • ROLE_ADMIN:可见“设备新增”、“用户管理”、“维护计划设置”按钮
    • ROLE_USER:仅见“设备查询”、“我要借用”按钮,且“我要借用”按钮点击后,后端BorrowRecordController.apply()会校验该用户status=1(在职)才允许提交
  • 权限拦截在SecurityConfig.java中:
    @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/lab/admin/**").hasRole("ADMIN") // /lab/admin/user-list → 管理员专属 .antMatchers("/lab/borrow/**").authenticated() // 所有借还操作需登录 .anyRequest().permitAll(); }

    注意:hasRole("ADMIN")中的ADMIN对应数据库sys_role.role_name='ROLE_ADMIN'的ROLE_前缀被Spring Security自动截掉,所以代码里写ADMIN而非ROLE_ADMIN。


4. 避坑指南:五个血泪经验总结的高频翻车点

4.1 现象:启动2-run.bat后控制台闪退,日志只显示“Process finished with exit code 1”

原因:application.properties中spring.datasource.password为空或错误,且MySQL未开启skip-grant-tables,导致JDBC连接超时后Spring Boot主动退出。
解决:

  1. 打开src/main/resources/application.properties,确认spring.datasource.password值与本地MySQL密码一致;
  2. 若用MySQL 8.0+,检查spring.datasource.url是否含allowPublicKeyRetrieval=true(如jdbc:mysql://localhost:3306/lab_equipment?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true);
  3. 在MySQL命令行执行SELECT user,host,plugin FROM mysql.user WHERE user='root';,若plugin='caching_sha2_password',需执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;。

4.2 现象:登录成功后跳转到/lab/dashboard,但页面空白,浏览器F12看到GET http://localhost:8080/lab/css/bootstrap.min.css net::ERR_ABORTED 404

原因:前端静态资源路径错位。项目用Thymeleaf模板引擎,login.html中写的是<link rel="stylesheet" href="/css/bootstrap.min.css">,但实际文件在src/main/resources/static/css/下,Spring Boot默认将/static映射为/**,所以正确路径应为/css/bootstrap.min.css。
解决:

  • 确认src/main/resources/static/css/bootstrap.min.css文件存在;
  • 检查login.html第8行:<link rel="stylesheet" href="/css/bootstrap.min.css">(开头有/,表示根路径);
  • 若仍404,在application.properties中显式配置:spring.web.resources.static-locations=classpath:/static/。

4.3 现象:借用设备后,设备列表里该设备status仍显示“在用”,但borrow_record表已新增记录

原因:EquipmentService.borrowEquipment()方法中,更新设备状态的SQL未加事务控制,或@Transactional注解未生效(常见于Service层方法被本类其他方法直接调用,绕过代理)。
解决:

  • 打开EquipmentService.java,找到borrowEquipment()方法,确认顶部有@Transactional(rollbackFor = Exception.class);
  • 检查该方法是否被本类其他方法调用(如public void borrowEquipment(){...}被public void handleBorrow(){borrowEquipment();}调用),若是,需改为this.borrowEquipment()→((EquipmentService)AopContext.currentProxy()).borrowEquipment(),或重构为跨Service调用;
  • 最简方案:在borrowEquipment()方法末尾手动执行equipmentMapper.updateStatus(equipmentId, 3);(3=维修中?不对!应为2=闲置?等等——这里暴露了业务逻辑漏洞:借用后状态应为3-维修中?不,应为1-在用?查代码发现EquipmentController.borrow()调用的是equipmentService.updateStatus(id, 1),但1是“在用”,而借用后设备应为“已借出”,状态码定义混乱。真实修复是:修改equipment.status字段含义,1=可用,2=已借出,3=维修中,4=报废,并同步改getStatusDesc()和前端JS。

4.4 现象:导出报表时Excel文件打开提示“发现不可读取的内容”,点击“是”后数据错乱

原因:ReportController.exportExcel()使用Apache POI 3.17,但pom.xml中声明的版本是<version>3.17</version>,而实际下载的jar包因Maven镜像问题变成了3.17-beta1,该版本对XSSFWorkbook的createSheet()方法有兼容性bug。
解决:

  • 删除本地Maven仓库中org/apache/poi/poi/3.17/目录;
  • 在pom.xml中锁定版本:
    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
  • 运行mvn clean compile重新下载;
  • 验证:在ReportService.java中打断点,查看WorkbookFactory.create(new FileInputStream(file))返回的XSSFWorkbook实例是否正常。

4.5 现象:管理员在“用户管理”页禁用某用户(sys_user.status=0)后,该用户仍能登录

原因:UserDetailsServiceImpl.loadUserByUsername()方法中,查询用户时未校验status=1(启用),只查了用户名密码。
解决:

  • 打开UserDetailsServiceImpl.java,找到loadUserByUsername()方法;
  • 修改SQL查询:
    String sql = "SELECT u.id,u.username,u.password,u.real_name,u.status,r.role_name " + "FROM sys_user u " + "LEFT JOIN sys_user_role ur ON u.id = ur.user_id " + "LEFT JOIN sys_role r ON ur.role_id = r.id " + "WHERE u.username = ? AND u.status = 1"; // 关键:AND u.status = 1
  • 同步修改SysUserMapper.xml中getUserByUsername的SQL,增加AND status = 1条件。

5. 权限控制进阶:从角色到按钮,三步实现“同角色不同实验室”的数据隔离

5.1 问题根源:当前RBAC模型只控功能,不管数据范围

系统现有权限模型(sys_role+sys_user_role)能区分“管理员能看到用户管理页,普通用户看不到”,但无法解决更真实的场景:物理学院的管理员,只能管理物理实验室的设备,不能碰化学实验室的数据。原项目没实现这点,所有SELECT * FROM equipment都是全库扫描。

5.2 方案选择:基于MyBatis拦截器的动态SQL注入

不改Spring Security(太重),也不用Shiro多 Realm(复杂),最轻量的解法是——在DAO层拦截SQL,自动追加AND lab_id = ?条件。我们用MyBatis的Interceptor接口,在Executor.query()执行前,解析SQL并注入lab_id。

@Component @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) }) public class LabDataInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; Object parameter = args[1]; // 只拦截 equipment 相关查询 if (ms.getBoundSql(parameter).getSql().contains("FROM equipment")) { // 从ThreadLocal获取当前用户所属实验室ID Long labId = CurrentUserLabHolder.getLabId(); if (labId != null) { BoundSql boundSql = ms.getBoundSql(parameter); String sql = boundSql.getSql(); // 在WHERE后插入 lab_id 条件(需处理无WHERE和有WHERE两种情况) if (sql.toLowerCase().contains("where")) { sql = sql.replaceFirst("(?i)where", "WHERE lab_id = " + labId + " AND"); } else { sql = sql + " WHERE lab_id = " + labId; } // 替换BoundSql BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject()); MappedStatement newMs = copyFromMappedStatement(ms, new BoundSqlSupplier(newBoundSql)); args[0] = newMs; } } return invocation.proceed(); } private MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) { Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); builder.resource(ms.getResource()); builder.fetchSize(ms.getFetchSize()); builder.statementType(ms.getStatementType()); builder.keyGenerator(ms.getKeyGenerator()); builder.keyProperty(ms.getKeyProperty()); builder.keyColumn(ms.getKeyColumn()); builder.databaseId(ms.getDatabaseId()); builder.lang(ms.getLang()); builder.resultOrdered(ms.isResultOrdered()); builder.resultSets(ms.getResultSets()); builder.timeout(ms.getTimeout()); builder.flushCacheRequired(ms.isFlushCacheRequired()); builder.useCache(ms.isUseCache()); builder.cache(ms.getCache()); return builder.build(); } static class BoundSqlSupplier implements SqlSource { private BoundSql boundSql; public BoundSqlSupplier(BoundSql boundSql) { this.boundSql = boundSql; } @Override public BoundSql getBoundSql(Object parameterObject) { return boundSql; } } }

关键逻辑说明:

  • CurrentUserLabHolder是一个ThreadLocal<Long>,在登录成功后,从sys_user表查出lab_id存入;
  • 拦截器只处理含FROM equipment的SQL,避免误伤其他表;
  • sql.replaceFirst()用正则(?i)where忽略大小写,确保WHERE或where都能匹配;
  • 不推荐在WHERE里拼AND lab_id = #{labId}:因为MyBatis的#{}是预编译,而此处SQL是字符串拼接,必须用+ labId(生产环境需防SQL注入,此处labId来自数据库查询,可信)。

5.3 前端适配:让“实验室切换”按钮真正生效

后端加了数据隔离,前端必须让用户感知到“我在哪个实验室”。原项目首页顶部只有欢迎语,现在加一个下拉框:

<!-- 在 dashboard.html 的 header 区域 --> <div class="pull-right"> <div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle">@PostMapping("/api/user/switch-lab") @ResponseBody public Result switchLab(@RequestParam Long labId) { // 校验labId是否属于当前用户(防越权) Long userId = getCurrentUserId(); Integer count = userMapper.countLabAccess(userId, labId); // SELECT COUNT(*) FROM sys_user_lab WHERE user_id=? AND lab_id=? if (count == 0) { return Result.fail("无权访问该实验室"); } CurrentUserLabHolder.setLabId(labId); String labName = labMapper.getNameById(labId); return Result.success(Map.of("labName", labName)); }

从那以后我每次接手实验室系统,都强制走一遍“切换实验室→查设备→借设备→看报表”全流程。不是为了炫技,而是因为数据隔离一旦漏测,上线后就是资损——你永远不知道哪个管理员会手抖点错实验室删光设备。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 0:42:54

VMware服务器虚拟化:资源池、HA、vMotion设计与避坑

简介&#xff1a;面向企业IT运维与基础架构工程师的VMware服务器虚拟化方案文档&#xff0c;围绕硬件利用率偏低、运维成本高、业务连续性难保障等常见问题&#xff0c;系统梳理vSphere体系下vCompute、vStorage、vNetwork的规划与部署思路&#xff0c;适合已具备一定虚拟化基础…

作者头像 李华
网站建设 2026/10/29 0:42:04

时间序列预测选型指南:ARIMA、Prophet、LSTM与GRU实战对比

1. 时间序列预测的四种主流武器&#xff1a;从统计学到深度学习的选型实战做时间序列预测这些年&#xff0c;被问得最多的一句话就是&#xff1a;“到底该用ARIMA、Prophet&#xff0c;还是上LSTM&#xff1f;”这个问题本身就问错了方向。工具没有绝对的好坏&#xff0c;只有跟…

作者头像 李华
网站建设 2026/10/29 0:40:48

正则表达式核心知识点与常见坑:从字符集合到回溯引用

简介&#xff1a;面向互联网、软件开发、数据分析等岗位初学者与进阶者的正则表达式知识点总结&#xff0c;已整理为便携PDF电子版。内容源自知名CS-Notes原创笔记&#xff0c;重新排版后更适合离线阅读。资源按九个章节展开&#xff1a;匹配单个字符、匹配一组字符、使用元字符…

作者头像 李华
网站建设 2026/10/29 0:40:12

校园水电费管理小程序实战:从毕设源码到可上线SaaS

简介&#xff1a;这是一套高分毕业设计级的校园水电费管理微信小程序源码&#xff0c;面向计算机、电子信息工程等专业本科生&#xff0c;专为毕设开发、课程设计及期末大作业提供完整可运行的实战项目参考。资源包含1072个文件&#xff0c;主体为86个Java后端服务代码、142个V…

作者头像 李华
网站建设 2026/10/29 0:40:09

离线安装PyInstaller 4.7源码包:下载、校验与避坑全指南

简介&#xff1a;PyPI官网发布的PyInstaller 4.7源码压缩包&#xff0c;面向需要将Python程序打包为独立可执行文件的开发者&#xff0c;也可用于云原生环境中分发依赖Zookeeper等分布式服务的应用。全包共404个文件&#xff0c;主体为Python源码、C语言源文件与头文件&#xf…

作者头像 李华
网站建设 2026/10/29 0:39:58

gVisor降低宿主暴露面,但它不是硬件虚拟机

把runtimeClassName写成某个名字&#xff0c;并不能证明工作负载已经被隔离。还要知道节点运行了哪个后端&#xff0c;以及应用系统调用实际经过了哪里。 应用内核与虚拟化层分清楚 gVisor实现应用内核&#xff0c;在应用和宿主之间增加隔离层。它与运行独立来宾内核的microV…

作者头像 李华