项目描述:
基于Spring Boot + Spring Cloud 微服务 + Docker( + Vue 3 + Arco Design)的编程题目在线评测系统。在系统前台,管理员可以创建、管理题目;用户可以自由搜索题目、阅读题目、编写并提交代码。在系统的后端,能够根据管理员设定的题目测试用例在自主实现的代码沙箱中对代码进行编译、运行、判断输出是否正确。其中,代码沙箱可以作为独立服务,提供给其他开发这使用。
技术选型:
前端:
Vue 3 + Vue-CLI脚手架 + Vuex状态管理
Arco Design 组件库 + 前端工程化:ELint + prettier + TypeScript
后端:
Java Spring Cloud + Spring Cloud Alibaba 微服务 + Spring Boot
Nacos注册中心 + Gateway + Docker
MySQL + Mybatis-Plus + Redis分布式session + RabbitMQ
主要工作:
系统架构:根据功能职责,将系统划分为负责核心业务的后端模块、负责校验结果的判题模块、负责编译执行代码的可复用代码沙箱。各模块之间相互独立,并通过API接口和分包的方式实现协作。
库表设计:根据业务流程自主设计用户表、题目表、题目提交表、并通过给题目表添加userId索引提升检索性能。
自主设计判题机模块的架构,定义了代码沙箱的抽象调用接口和多种实现类(比如远程/第三方代码沙箱),并通过静态工厂模式+spring配置化的方式实现了对多种代码沙箱的灵活调用。
使用代理模式对代码沙箱接口进行能力增强,统一实现了对代码沙箱调用前后的日志记录,减少重复代码。
由于判题逻辑复杂、且不同题目的判题算法可能不同(比如Java题目额外增加空间限制),选用策略模式代替if-else独立封装了不同语言的判题算法,提高系统的可维护性。
为了保证沙箱宿主机的稳定性,选用Docker隔离用户代码,使用Docker Java库创建容器隔离执行代码,并通过tty和Docker 进行传参交互,从而实现了更安全的代码沙箱。
为保证项目各模块的稳定性,选用Spring Cloud Alibaba 重构单体项目,(使用Redis分布式session存储登录用户信息)并将项目划分为用户服务、题目服务、判题服务、公共模块。