声明:本文为本人在软考系统架构设计师备考期间的练手写作,不保证内容的原创性与正确性,仅供参考,请勿照抄和用于学术论文等正规场合,因不当使用产生后果一律自负。
摘要
2019年3月,我单位联合某高校研发了《程序在线评测比赛考试系统》。系统以程序代码在线提交自动评测功能为核心,分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等,支持对接教务平台。在项目中我担任系统架构师,负责架构设计工作。
本文以该系统为例,主要论述了微服务架构在项目中的具体应用。系统划分为前端Web服务、平台保障服务、业务服务。前端Web服务由Nginx负载均衡与服务器集群结合,解决前台界面的并发问题;平台保障服务以Eureka为中心,分为API网关、服务注册中心、监控平台,用以实现基础服务框架;业务服务基于Spring Cloud开发,分为多个微服务,实现具体业务功能,解决协同问题。最终系统顺利上线,获得用户一致好评。
正文
笔者在一个专为高校建设计算机专业智能教学一体化平台的单位任职,过往成果有《计算机组成原理仿真实验系统》等。2019年3月,我单位联合某大学研发了《程序在线评测比赛考试系统》项目(以下简称为“OJ系统”),以取代原有传统的编程上机考试平台。
系统以程序代码的在线提交自动评测功能为核心,主要分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等。题库模块主要负责试题和测试用例的管理,用户根据试题要求编写程序代码提交到系统,系统将测试用例与程序代码发送给评测机模块,由评测机自动编译、执行、判分,并将结果发送给其他相关模块进行统计;实验作业模块用于在线布置作业,从题库中选取试题,设置截止日期等要求;考试模块用于学生在线考试,按教师预先设置的参数自动从题库随机抽题生成试卷,以及向教务平台上传考试成绩;比赛模块主要用于ACM竞赛的培训;抄袭判定模块用于鉴定代码与他人代码雷同率;用户管理模块负责用户信息的管理。在这个项目中,我担任了系统架构师的职务,主要负责系统的架构设计相关工作。
我们经过分析,决定使用微服务架构来开发OJ系统项目。在单块架构设计中,所有功能模块都属于一个庞大的系统,各模块之间耦合性太强,无法进行分布式部署,单个功能模块也很难在水平方向上灵活的按需扩展。与单块架构相比,微服务架构的优势有:1. 解决了复杂性问题,应用被分解为多个服务,每个服务都有消息驱动API定义清楚的边界;2. 提供了模块化的解决方案,单个服务模块很容易开发、理解和维护,无需协调其他服务对本服务的影响;3. 技术自由,每个服务都可由专门的开发团队来开发,可分别选择合适的技术,只需提供标准的API服务;4. 性能与可扩展性强,不同类型的服务可针对性的部署在适合资源需求的硬件上,支持弹性配置。
OJ系统的微服务架构基于Spring Cloud框架,使用Java语言开发,将平台服务划分为三类,分别为前端Web服务、平台保障服务、业务服务。下面针对这三类服务展开具体说明。
(论点内容与本人其他博文重复,无法通过审核,请前往以下链接阅读。)
javascript:void(0)
总结
系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000以上的学生用户、评测了70000条以上的程序代码,获得了单位同事领导和学校教师们的一致好评。在开发和试运行过程中,主要遇到了两个问题。一是跨域问题。OJ系统前后端分离,前端通过Ajax访问后端服务。由于浏览器同源策略的限制,导致前端UI无法正常访问不同端口和IP的后端服务。我们利用Spring Boot后端的Cors跨域机制解决了该问题。二是评测机宕机问题。评测机服务需要执行用户提交的代码,但由于部分用户短时间内提交了大量不安全代码,导致所有评测机服务全部宕机。我们引入心跳机制、快照回滚机制,以及基于机器学习技术的预判断机制,使评测服务宕机时能够在10秒内自动重置恢复运行,最终解决了该问题。
实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统采用了合适的架构设计密不可分。经过这次微服务架构应用的方法和实施的效果后,我也看到了自己身上的不足之处,在未来还会不断地更新知识,完善本系统的架构设计,使整个系统能够更加好用,更有效地服务于高校师生。