微服务个人项目
在线编程判题(OJ)平台
基于微服务 + 消息队列 + Docker 代码沙箱的在线判题系统,安全执行并评测用户提交的代码。
角色:独立开发
时间:个人项目
背景与目标
- 基于 Spring Cloud 微服务 + MQ + Docker 的在线编程判题系统,能依据预设题目用例对用户提交的代码进行执行与评测。
我的职责
- 定义代码沙箱抽象接口与多种实现(远程 / 第三方),用静态工厂模式 + Spring 配置化灵活调用;用代理模式统一调用前后日志记录。
- 判题算法用策略模式替代 if-else 按语言独立封装(本人主负责 Java);用模板方法模式统一「编译 - 执行 - 取输出 - 清理」流程。
- 用 Java Runtime exec + Process 输入流实现 Java 原生沙箱;用 Docker Java 库创建容器隔离执行,通过 tty 传参交互。
- 判题异步化:将用户提交 id 发送至 RabbitMQ,经 Direct 交换机转发判题队列消费,异步更新提交状态。
- 安全加固:自定义 SecurityManager 关闭写 / 执行文件权限;HostConfig 限制容器内存与网络隔离、设置执行超时回收资源。
关键结果
- 自研代码沙箱:Java 原生(Runtime exec)+ Docker 双实现,工厂模式 + Spring 配置灵活切换
- 判题异步化:题目服务经 RabbitMQ Direct 交换机转发判题队列,响应时长缩短约 1.5s、QPS 提升 25%
- 多重安全加固:SecurityManager 权限控制 + Docker 内存 / 网络隔离 + 执行超时回收
亮点与难点
- 工厂 + 策略 + 模板 + 代理四种设计模式落地,沙箱可插拔、判题可扩展。
- 多层安全防护,兼顾宿主机稳定与用户代码隔离执行。
技术栈
Spring CloudRabbitMQDockerMySQL