架构训练营 第三模块作业 - 外包学生管理系统详细架构设计文档
前言
本文是外包学生管理系统详细架构设计文档,用于知道学生管理系统后续的开发、测试和运维。
词汇表
nginx:负载均衡服务器,用于分发请求
Mysql:关系型存储数据库
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,处理效率也十分低下。
解决问题:
学生信息管理数据信息量大,修改不变
数据分析时间长。
设计目标:
实现学生信息关系的系统化、规范化、自动化。
主要内容:
统计学生各类信息,进行日常管理。 增删改查、学生选课、成绩查询等。
2. 约束和限制
预算不超过 100 万
服务器不超过 5 台
3. 总体架构
3.1 架构分析
3.1.1 高可用
对于学生系统来说,数据丢失后会影响学校的教学运作,且需要大量的人工重新录入,是非常严重的事情。
3.1.2 高性能
基于用户规模的预估,不需要高性能考虑。如果对选课有高并发场景的需要,可以通过排队等技术方案解决。
3.2 总体架构
采用 nginx 作为反向代理服务器,负责把请求转发到对应的子系统上。
整个系统由学生子系统、课程子系统和权限子系统构成
数据采用主从架构,一台主 MySQL,和一台备 MySQL, 主备数据复制。
4. 详细设计
权限子系统
负责账号分配/系统登录/权限管理功能。
mysql 负责存储用户的账户信息包括密码,身份信息,权限信息。由权限子系统的 API 服务层负责增删查改这些信息。并以拦截器形式拦截整个系统的所有请求,确认用户身份权限符合后,再进行下一步的操作。
由于这部分信息相对比较固定,可以通过本地缓存 caffiene 对用户信息进行缓存。并且在信息同步时候同步更新缓存。
课程子系统
负责课程管理,考试管理。
mysql 负责存储课程信息包括教材信息,课程排课信息,课程的考试信息,平时成绩,以及学生的考试成绩。课程子系统通过 Restful http API 提供相关的增删查改功能。学生抢课需要注意,每个课程的容量限制的校验。通过权限子系统去判断用户是否有权限去设置课程,考试等。
学生子系统
负责学生选课,以及学生上传/下载文件
mysql 负责存储学生的选课信息,学生上传的文件路径,具体文件直接存储在业务服务器上。通过权限子系统识别用户是否有权限去选课等。通过调用课程子系统的 API 来得到课程和考试的基础信息。学生子系统主要负责上传/下载文件,以及学生的选课功能。
4.1 核心功能
权限子系统需要校验用户的密码,校验成功后,下发加密用户 pin 的登录 ticket 到用户 cookie 中去。以后,每次请求后,权限子系统会解析携带的 cookie,并解密为用户的 pin,从而知道用户是否已经登录。
4.2 关键设计
用户的密码网络传输需要 js 使用 rsa 公钥机密,服务端权限子系统使用 rsa 私钥加密。数据库中的密码需要使用 BCrypt 算法进行加密。服务端对传入的解密密码用 BCrypt 再次加密后,使用 BCrypt 算法判断传入的密码与存储的密码是否匹配,来判断密码是否合法。系统建议使用 https 协议。
4.3 设计规范
整个系统使用 Spring MVC 作为主体框架,MyBatis 作为 mysql 的 DAO 层, 以 Restful API 规范来设计对外暴露的 API 路径和管理后台的路径。
5. 质量设计
可测试性:系统异常都要使用 logback 记录异常日志
可维护性: 需要用 git 管理代码历史,并记录上线历史。
可观测性:管理后台,建议保存用户操作日志,防止误操作或者追溯恶意操作。
6. 演进规划
外包学生管理系统 2 期:
如果服务更多学校的用户,可以改用业务服务器集群来扩展服务器的容量,
外包学生管理系统 3 期:
如果业务功能变得更加复杂,可以通过改为微服务架构,使得功能的更容易扩展和维护。
评论