架构实战营模块三作业
前言
本文是外包学生管理系统详细架构设计文档,用于指导外包学生管理系统后续的开发、测试和运维。
词汇表
Nginx:一个高性能 HTTP 和反向代理 web 服务器,同时提供了 IMAP/POP3/SMTP 服务。
MySQL:一个流行的关系型数据库管理系统。
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大,由此带来了几个明显的问题:
成本高:自动化程度低,需要花费大量的教师资源对学生的学籍、课程、成绩、奖惩等信息进行管理;
效率低:学生信息管理数据信息量大修改不方便,对一系列数据进行分析时花费时间长;
准确度有待提升:学生管理数据量大,大量手工式的处理很容易产生数据错误,对正常管理带来干扰;
基于以上背景,学校需要引入学生信息管理系统,实现学生信息关系的系统化、规范化、自动化,从而降低管理成本,提高日常管理的效率,提升信息管理的准确度。系统的主要任务是对学生各类信息进行日常管理,如查询、修改、增加、删除、以及学生选课、成绩的查询等功能设计。
2. 约束和限制
校方要求:
资源成本控制在 30 万以内;
数据只能有极少量丢失,不允许大量丢失;
系统需要考虑扩展性,避免相互之间的影响;
能够支撑 1 万师生的在线使用;
团队情况:
团队有 4 个成员;
各成员对 MySQL 都很熟,对 SQLServer 和 Oracle 有一定了解;
3. 总体架构
3.1 架构分析
3.1.1 高性能
学校师生量 1w,不存在高并发场景;同时学生管理系统作为学校的内部系统,系统的响应时间在 5s 左右都在可接受范围之内。因此系统不用特别考虑高性能的要求。
3.1.2 高可用
学生管理系统即便出现宕机也不会对学校正常运营造成大的影响,但数据只能出现少量丢失,因此系统无须考虑计算高可用,但需要考虑存储的高可用。
3.1.3 可扩展
学生管理系统有一定的业务复杂性,后续需求可能会不断变动,且校方明确要求系统需要可扩展。
3.1.4 成本
采购成本不能超过 30 万,因此需要控制资源的数量和单价,尽量使用开源的东西。
3.1.5 安全
学生管理系统是在学校内部使用,不会暴露在外网。主要是对学生日常管理过程中产生的数据,不会涉及敏感数据。综合分析,系统对不同角色设置相应的权限管理,同时做好数据库的账号管理即可。
3.2 总体架构
学生管理系统划分为学生子系统、课程子系统和权限子系统 3 个子系统;
使用 Nginx 做代理服务器提供对学生、课程和权限子系统的功能访问;
数据库采用 MySQL 的主备方式;
4. 详细设计
4.1 核心功能
4.1.1 权限子系统
权限子系统包含登陆、账号分配、权限分配功能。权限子系统是学生子系统和课程子系统都需要依赖的通用能力。其中权限分配包括菜单、功能、操作粒度的权限,每类用户拥有不同的权限,管理员是系统的 root 用户。
4.1.2 学生子系统
包含基本信息管理、账号注册功能。基本信息包含学生的姓名、学号、联系方式等信息,以及组织管理层级。学生首次登陆时需要进行学生账号注册,账号注册需要系统先进行账号分配、然后进行权限分配、最后绑定账号,完整的流程图如下:
4.1.3 课程子系统
课程子系统包含课程录入、选课、排课、教材选定、试卷管理、考试、成绩评定功能。考虑到课程、考试、成绩关联性比较大,我们把这些功能都放到课程子系统里面。学生选课的流程如下:
4.2 关键设计
1)路由策略
学生管理系统采用 Nginx 代理学生、课程和权限 3 个子系统,通过配置不同的路径访问不同的子系统:
^~ /students/:访问学生子系统
^~ /courses/:访问课程子系统
^~ /permissions/:访问权限子系统
2)存储高可用
数据库使用 MySQL 一主一备两台机器,主备之间的数据同步采用 MySQL 自带的复制方案。当主机故障后,可手动切换到备机。
4.3 设计规范
技术框架。前端技术使用 H5+vue+Webpack,服务端使用 Java spring boot 框架;
开发规范。服务端开发遵守《阿里巴巴 Java 开发手册》
接口规范。接口采用 restful 风格,数据格式采用 JSON 格式。APIs response body 包含 code, message, data 三部分。
存储引擎。MySQL 使用 Innodb 存储引擎。
日志规范。日志使用 slf4j,底层使用 log4j,使用同一套日志格式规范。
文档规范。使用 swagger 定义 API 文档。
5. 质量设计
可测试性
接口测试:可使用 Postman 进行测试;
功能测试:可直接通过 UI 界面测试;
性能测试:系统没有高性能要求,不必进行压测;
可用性测试:存储高可用的测试可直接模拟 MySQL 主机 down 掉后切换到备机历史数据是否仍然存在;
可维护性
系统的架构相对简单,同时考虑到成本,不必引入复杂的运维工具,因此系统的可维护性方案为:
代码可维护性:通过代码整洁、分模块、完善文档来提高代码可维护性;
JVM 监控:直接使用 JDK 自带的 JConsole 进行监控;
线上排错:通过 log + dump 文件进行线上问题排查;
可观测性
通过 swagger API 文档+日志+JVM 监控+系统的 UI 界面来提高系统的可观测性。
成本控制
系统采用 1 台 Nginx 服务器+3 台应用服务器+2 台 MySQL 服务器,服务器采用普通的配置即可,架构已满足成本要求。
6. 演进规划
一期:完成学生子系统、权限子系统和课程子系统中的课程录入、选课、排课、教材选定功能的上线。
二期:完成考试、成绩评定功能的上线。
版权声明: 本文为 InfoQ 作者【spark99】的原创文章。
原文链接:【http://xie.infoq.cn/article/dfe0819991acfc14b52eba875】。未经作者许可,禁止转载。
评论