架构实战训练营模块三课后作业
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源, 处理效率也十分低下。
为提高学生管理的管理水平,优化资源,尽可能降低管理成本成为学生管理的新课题,学生管理系统是从 学生管理现状出发,根据学生管理的新要求进行开发设计的,它需要解决学生信息管理数据信息量大修改 不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息。
系统主要应用于学校学生信息管理,总体任务是实现学生信息管理的系统化、规范 化和自动化,其主要任务是管理学生相关信息,如学籍、课程、成绩、奖惩。
系统需要包含学生管理,课程管理,考试管理这三个大的功能模块。同时,针对不同类型用户,要有权限管理模块。
2. 约束和限制
1)1 期只需要服务一个学校,大概 4000 人。
2)学校经费有限,只能提供 3 台服务器。(2 台作为数据库服务器,1 台作为业务服务器)
3. 总体架构
3.1 架构分析
高性能:由于只需要服务 4000 名学生,每秒峰值最多就几百,即使是单台业务服务器,也不会够成压力。
高可用:由于学校这些需求可以不完全依赖于这个系统,所以对高可用的需求也不高。
高可靠:录入的数据需要有一定的可靠性,不能容忍全部丢失,因此需要对数据有备份。因此,设计了 mysql 的主备架构。
3.2 总体架构
1)数据库采用 mysql 主备架构。一台主 MySQL 和一台备 MySQL。正常情况下,主数据库服务器对外提供消息写入和消息读取服务,备服务器不对外提供服务;主数据库服务器宕机的情况下,备服务器对外提供消息读取的服务。
2)业务服务器按功能模块拆分为 3 个子系统,课程子系统/学生子系统/权限子系统全部部署到一台业务服务器上。
3)Nginx 作为反向代理,http 缓存服务器。负责把请求的路径映射到对应的业务子系统上,并对一些静态页面做缓存。
4. 详细设计
1)权限子系统
负责账号分配/系统登录/权限管理功能。
mysql 负责存储用户的账户信息包括密码,身份信息,权限信息。由权限子系统的 API 服务层负责增删查改这些信息。并以拦截器形式拦截整个系统的所有请求,确认用户身份权限符合后,再进行下一步的操作。
由于这部分信息相对比较固定,可以通过本地缓存 caffiene 对用户信息进行缓存。并且在信息同步时候同步更新缓存。
2)课程子系统
负责课程管理,考试管理。
mysql 负责存储课程信息包括教材信息,课程排课信息,课程的考试信息,平时成绩,以及学生的考试成绩。课程子系统通过 Restful http API 提供相关的增删查改功能。学生抢课需要注意,每个课程的容量限制的校验。通过权限子系统去判断用户是否有权限去设置课程,考试等。
3)学生子系统
负责学生选课,以及学生上传/下载文件
mysql 负责存储学生的选课信息,学生上传的文件路径,具体文件直接存储在业务服务器上。通过权限子系统识别用户是否有权限去选课等。通过调用课程子系统的 API 来得到课程和考试的基础信息。学生子系统主要负责上传/下载文件,以及学生的选课功能。
4.1 核心功能
1)权限子系统的登录功能
权限子系统需要校验用户的密码,校验成功后,下发加密用户 pin 的登录 ticket 到用户 cookie 中去。以后,每次请求后,权限子系统会解析携带的 cookie,并解密为用户的 pin,从而知道用户是否已经登录。
4.2 关键设计
1)权限子系统的登录功能的安全性
用户的密码网络传输需要 js 使用 rsa 公钥机密,服务端权限子系统使用 rsa 私钥加密。数据库中的密码需要使用 BCrypt 算法进行加密。服务端对传入的解密密码用 BCrypt 再次加密后,使用 BCrypt 算法判断传入的密码与存储的密码是否匹配,来判断密码是否合法。系统建议使用 https 协议。
4.3 设计规范
整个系统使用 Spring MVC 作为主体框架,MyBatis 作为 mysql 的 DAO 层, 以 Restful API 规范来设计对外暴露的 API 路径和管理后台的路径。
5. 质量设计
可测试性:系统异常都要使用 logback 记录异常日志
可维护性: 需要用 git 管理代码历史,并记录上线历史。
可观测性:管理后台,建议保存用户操作日志,防止误操作或者追溯恶意操作。
6. 演进规划
2 期,如果服务更多学校的用户,可以改用业务服务器集群来扩展服务器的容量,
3 期,如果业务功能变得更加复杂,可以通过改为微服务架构,使得功能的更容易
扩展和维护。
评论