基于微服务架构的自动判卷系统设计与实现

known 发布于 2025-08-25 阅读(465)

摘" 要:基于当前软件开发学习者缺少自主学习和训练的平台这一情况,开发了一款适用于程序设计语言基础训练的在线答题和自动判卷系统,达到提高学习者程序设计基础能力的目标,同时系统可以为高校教师提供辅助教学实验平台,减轻教师实验评分压力。自动判卷系统基于Spring Cloud微服务架构,根据业务进行功能划分,形成多个微服务,各微服务统一由Nacos进行管理。分布式微服务系统的架构缩减了系统重构时间,提高了开发效率、降低了维护成本。测试证明,系统运行性能良好,后期的维护效率得到有效提升。

关键词:微服务;Spring Cloud;系统架构;分布式;自动判卷

中图分类号:TP311" 文献标识码:A" 文章编号:2096-4706(2024)11-0101-06

Design and Implementation of Automatic Test Grading System Based on Microservice Architecture

LI Yehong, HUANG Peiquan, ZHOU Shiting, ZHAO Xinyu

(School of Computer and Information Engineering, Guangdong Polytechnic of Industry and Commerce, Guangzhou" 510510, China)

Abstract: Based on the current situation where software development learners lack a platform for self-directed learning and training, this paper develops a system for online answering questions and automatically judging test papers for basic training of programming language. It can achieve the goal of improving learners basic programming ability, and at the same time, it can provide an auxiliary teaching experiment platform for college teachers and reduce the pressure of teachers experiment grading. The automatic test grading system is based on the Spring Cloud microservice architecture, which divides functions according to business and forms multiple microservices. Each microservice is managed uniformly by Nacos. The architecture of distributed microservices system reduces system reconstruction time, improves development efficiency, and reduces maintenance costs. Tests have shown that the system performs well and the maintenance efficiency in the later stage is effectively improved.

Keywords: microservice; Spring Cloud; system architecture; distributed; automatic test grading

0" 引" 言

随着互联网技术的发展,对IT技术人员,特别是软件开发工程师的需求十分迫切。然而,对于软件开发技术的学习需要坚实的程序设计语言基础,如:C语言,C++、Java、Python等,社会学习者和部分在校学生,在学习过程中,往往缺乏有效的自主学习和训练,因此,设计一款可以实现自动评判的在线答题系统,对初学者的训练尤为重要。另外,对于高校教师授课,一个可以实现辅助实验结果评分的在线答题平台,对于减轻教师工作量,让教师有更充分的时间设计教学案例,对教学的质量提升起到积极的作用。基于此目的,本项目设计开发一款适用于IT爱好者自学、教师辅助教学实验的在线答题和自动判卷系统。

自动判卷系统主要用于各类题库练习,包括出题系统、答题系统和判卷系统。主要功能包括题库模块、抽题模块、答题模块、判卷模块、会员模块、支付模块、统计模块、系统管理模块。采用前后端分离设计模式,前端采用Vue实现、后端采用SpringBoot+MyBatis+MySQL实现。

由于系统涉及的模块较多,业务相对复杂,随着业务的发展,整个系统不断更新已成为常态,这对于传统的单体架构系统而言,很难满足业务发展需要,系统维护成本不断增加。即使是一个细小的修改,就会导致项目重新部署,频繁的部署对系统的运营带来很多的问题,从而极大地降低了系统的可维护性,提高了维护成本。

基于上述单体架构存在的问题,本文提出使用Spring Cloud微服务架构技术进行系统架构,使用的技术包括:服务注册、服务发现、服务调用、熔断机制、统一管理、网关等,从而解决系统架构中存在的问题。

1" 微服务系统架构技术

随着互联网技术的发展,当前Web应用特别是PC端网站的规模越来越复杂,从而导致Web系统架构技术也在不断地进化和发展。从单体系统架构和垂直系统架构,到分布式架构和面向服务的架构(Service Oriented Architecture, SOA)架构,再发展到现在的微服务架构。各种架构技术都有其优点和适用性,在不同的应用领域存在不同的缺点。在系统架构过程中,需要综合各方面的因素,选择合适的架构技术。

微服务(Microservice)架构是一种目前在企业实践中得到广泛应用的软件架构。微服务架构将一整个软件应用按照细粒度的模块划分规则解耦成一个个功能独立的模块[1]。

微服务架构是面向服务的架构SOA的发展,强调服务的“彻底拆分”,微服务的优点是:服务的拆分是服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展。微服务之间采用Restful等轻量级http协议相互调用。其缺点是,微服务缺点是,服务拆分边界的界定需要具备科学性和可行性,在开发前期需要投入较大的时间成本。

2" 自动判卷系统架构设计

系统设计是系统开发的重要部分,自动判卷系统项目着重在线评判系统的角色设计、模块设计、数据库设计和微服务架构的内容。根据系统角色和模块的划分对数据库进行详细设计[2]。

从功能模块角度来看,自动判卷系统与学习者(包括学生)、教师、教学管理人员,系统管理者等人员有关,主要的模块包括:题库模块、抽题模块、答题模块、判卷模块、会员模块、支付模块、统计模块、文件服务模块、短信服务模块、系统管理模块等,如图1所示。

自动判卷系统学习者角色业务流程图如图2所示。

对于单体应用系统,其设计方式是将所有功能模块整合在一起形成一个服务包,在分布式环境下,复制多个服务包分发到各个服务器,其体系架构图如图3所示。

单体架构技术所设计的自动判卷系统相对复杂,对于后期维护工作相对困难。比如,某个功能模块需要更新,涉及所有的模块重新部署,这导致了维护工作的复杂度大量剧增,维护成本同步增加,同时也导致系统的体验度降低。

通过Spring Cloud微服务架构理念[3],对Spring Cloud微服务技术的分析与研究,从自动判卷系统自身的功能出发,对系统进行微服务架构,自动判卷系统微服务架构把传统的系统对系统划分为各个微服务,各个微服务之间耦合度非常低,系统架构图具体如图4所示。

3" 系统微服务架构关键技术实现

3.1" 服务注册与发现

服务的注册和发现是微服务架构的基础[4],是微服务架构体系中最关键的组件之一。服务注册中心,负责所有业务服务的注册,并以Rest的形式对外发布;负责记录服务和服务地址的映射关系,以便其他请求(网关)能够发现。当需要调用一个业务服务时,服务网关就到服务中心找到服务的地址进行调用[5]。服务注册中心使用Nacos技术实现,Nacos Discovery可以将服务自动注册到Nacos服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery也将服务实例自身的主机地址(host)和端口号(port)、主页等内容注册到Nacos。

通过配置文件可以将各个微服务注册到Nacos服务器,当客户端需要访问某个微服务,通过网关API可以在Nacos注册中心发现对应的微服务,注册与配置如图5所示。

自动答题系统通过配置可以将各微服务注册到Nacos服务器,如图6所示。

3.2" 分布式调用

Dubbo提供的是一种Client-Based的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持的注册中心Nacos。从注册中心视角来看,它负责以服务名(例如:org.apache.dubbo.sample.tri.Greeter)对整个集群的实例地址进行聚合,每个对外提供服务的实例将自身的实例ip:port地址信息(例如:127.0.0.1:8848)注册到注册中心。

3.3" 路由网关应用

服务网关是微服务集群系统中不可或缺的一部分。服务网关的基本功能有统一接入和安全防护等,在任务处理模块中,服务网关用于对任务进行过滤和安全验证,并将任务转发给负载均衡调度器[6]。

3.3.1" 路由配置

路由配置的主要作用是指定服务中心地址和端口号;指定微服务是否可以被客户端获取到;设置路由的名称和地址供客户端访问,关键配置命令如下:

#服务名

spring.application.name=service-gateway

#nacos服务地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#使用服务发现路由

spring.cloud.gateway.discovery.locator.enabled=true

#设置路由id

spring.cloud.gateway.routes[1].id=service-acl

#设置路由的urilb://nacos注册服务名称

spring.cloud.gateway.routes[1].uri=lb://service-acl

#设置路由断言,代理servicerId为auth-service的/auth/路径

spring.cloud.gateway.routes[1].predicates=Path=/*/acl/**

#配置service-train服务

spring.cloud.gateway.routes[0].id=service-train

spring.cloud.gateway.routes[0].uri=lb://service-train

spring.cloud.gateway.routes[0].predicates=Path=/train/**

#配置service-edu服务

#spring.cloud.gateway.routes[2].id=service-msm

#pring.cloud.gateway.routes[2].uri=lb://service-msm

3.3.2" 熔断机制

微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。

为避免雪崩问题,在配置文件中开启熔断机制,同时设定熔断的超时时间,达到某个阈值,将对某个微服务开启熔断降级机制,关键配置指令如下:

#开启熔断机制

feign.hystrix.enabled=true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

3.4" 服务发现与调用

微服务之间的调用Feign自身就是一个声明式的伪HTTP客户端,同时Feign是采用基于接口注解的编程方式,使用更加简便[7]。要使某个微服务可以被其他客户端或者微服务调用,需要开启微服务发现功能,关键注解如下:

@EnableDiscoveryClient

@EnableFeignClients

4" 系统功能实现

自动判卷系统划分为多个子系统,包括前端答题子系统、后端管理子系统、API接口子系统。Spring Security在安全框架中具备强大的功能[8],为保证系统的安全性,自动答题系统使用Spring Security整合用户身份验证和权限控制,当一个请求由客户端发起后,经由前置服务器转发至负载均衡服务后到达业务服务器,业务服务器进行逻辑判断后向后台发送请求,至此成功进入到新架构的服务器内部,开始正式处理及解析[9]。

4.1" 前端答题子系统

前端答题子系统具有用户注册和登录、题库查询、在线答题、自动评分、在线模拟训练、在线实验、在线学习、视频点播等功能。前端答题子系统功能使用vue.js、ElementUI等技术实现[10]。前端答题子系统部分功能实现如图7所示。

4.2" 后端管理子系统

后端管理子系统,具有用户管理、题库管理、在线答题管理、自动评分管理、在线模拟训练管理、在线实验管理、上传视频等功能。后端管理界面使用vue.js、ElementUI等技术实现,后端管理子系统部分功能实现如图8所示。

4.3" API接口子系统

API接口主要是为前端答题子系统和后端管理子系统提供Restfullf风格的API接口服务。API接口由Spring Cloud、Spring Boot、MySQL MyBatis和MyBatis Plus、Redis、Spring Security等技术实现。

5" 自动判卷微服务系统测试

压力测试的目标是对系统所能承受的最大负荷,找出系统的瓶颈并进行优化。压力测试主要关注的性能指标是:吞吐量、响应时间和错误率。

性能测试是为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据[11]。

5.1" 系统总体测试

本测试使用JMeter对系统进行压力测试。本次测试1秒内启动200个线程,100次循环,就是20 000个请求,查看http请求,总体测试结果数据如表1所示。

从表1中可以看出,20 000个请求,耗费的时间是148 ms,吞吐量是890.2 KB/s,中位数为56 ms,说明大部分的请求系统响应时间为56 ms,有90%的请求都在268 ms完成,而异常数为0.38%,20 000个请求当中大概有76个请求异常。从吞吐量、响应时间及错误率来看,微服务所架构的系统性能还不错。

5.2" 中间件性能测试

本次对Nginx、Gateway、三级级联进行测试,测试结果如表2所示。

从数据分析发现,三级级联测试性能较低,其原因是获取三级级联数据时,频繁进行数据库查询。对三级级联数据使用Redis进行缓存,减少数据库操作。再次进行测试,数据如表3所示。

从表中可以看到,对级联数据进行优化后,性能得到了大幅的提升。

6" 结" 论

本文根据各种系统架构技术的分析,结合自身系统的特点,采用Spring Cloud微服务技术对系统进行架构,从测试结果来看,无论是吞吐量还是响应时间和错误率都有不错的表现。

通过使用微服务技术对本系统进行架构,与其他系统架构相比,特别是与单体架构对比,前期系统的规划与设计付出较大的时间成本和人力成本,同时要求系统架构师具有较为丰富的项目经验。而到后期维护阶段,在扩展性和可维护性方面具有较大的优势,系统也具有更好的健壮性。

对于各种架构技术,不能单纯地说哪种架构技术更好,或者哪种架构技术不好。每一种架构技术都具有一定的优缺点,在进行系统架构时,需要考虑系统规模,系统应用场景、未来的发展及后期的扩展等方面进行综合的考虑。

参考文献:

[1] 冀超,彭鑫,赵文耘.基于负载关系图的微服务自动伸缩方法 [J].计算机应用与软件,2022,39(6):12-20.

[2] 邱祥庆,刘德喜,万常选,等.文本情感原因自动提取综述 [J].计算机研究与发展,2022,59(11):2467-2496.

[3] 李西明,梁志才,刘龙浩.基于微服务架构的在线评判系统设计与实现 [J].软件导刊,2023,22(8):144-150.

[4] 刘从军,刘毅.基于微服务的维修资金管理系统 [J].计算机系统应用,2019,28(4):52-60.

[5] 吴争荣,包新晔,尹立彬,等.基于微服务架构的智能配电网基础平台开发 [J].计算机应用与软件,2022,39(9):38-44.

[6] 杨干龙,江凌云.基于机器学习的微服务负载均衡算法研究 [J].计算机科学,2023,50(5):313-321.

[7] 吴侠,艾芳菊.基于微服务架构的众筹系统 [J].湖北大学学报:自然科学版,2020,42(1):103-108.

[8] 潘秋霞,林中明,潘金兰.基于微服务架构的毕业审核系统研究与实现 [J].现代信息科技,2023,7(16):28-33.

[9] 于曼,黄凯,张翔.基于微服务架构的ETC数据层平台的设计与实现 [J].计算机应用与软件,2021,38(7):29-34+105.

[10] 程书玲,吴丹丹.基于微服务架构的电商系统的设计与实现 [J].黑龙江科学,2023,14(12):150-152.

[11] 雷擎.基于Kubemark的微服务性能仿真测试研究 [J].计算机工程与科学,2020,42(7):1151-1157.

作者简介:李烨红(2003—),女,汉族,广东茂名人,研究方向:软件开发;黄培泉(1979—),男,汉族,广东茂名人,讲师,硕士,研究方向:Web系统架构;周诗婷(2003—),女,汉族,广东茂名人,研究方向:JavaWeb开发;赵芯誉(2003—),女,汉族,广东珠海人,研究方向:软件开发。

收稿日期:2023-10-26

基金项目:2022年度广东省科技创新战略专项资金(大学生科技创新培育)立项项目(pdjh2022b0820);2021年省高等职业教育教学质量与教学改革工程项目(GDJG202044)

标签:  系统 

免责声明

本文来自网络,不代表本站立场。如有不愿意被转载的情况,请联系我们。

iidomino cuppor