架构训练营模块三作业
前言
本文是学生管理系统的架构说明文档,旨在整体上说明系统整体设计、部署架构
词汇表
Gin: go语言开源web框架
Json: 一种轻量级序列化方案
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,处理效率也十分低下。
为提高学生管理的管理水平,优化资源,尽可能降低管理成本成为学生管理的新课题,学生管理系统是从学生管理现状出发,根据学生管理的新要求进行开发设计的,它需要解决学生信息管理数据信息量大修改不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息。
因此学生信息管理系统可以通过系统规范化地管理、科学性统计和快速查询、修改、增加、删除等,提高信息的准确度以及日常管理的工作效率。
本系统主要是应用于学生各类信息的管理,总体任务是实现学生信息关系的系统化、规范化、自动化,其主要任务是统计学生各类信息进行日常管理,如查询、修改、增加、删除、以及学生选课、成绩的查询等功能设计的管理系统。
2. 约束和限制
1.必须在3个月内完成
2.服务器数量不超过4台,数据库服务器不超过3台
3.数据存储至少备份一份
4.以Go语言为开发语言
3. 总体架构
为学生提供选课、上传笔记、考试等功能
为教师提供创建考试、阅卷、录分等功能
为教务提供管理账号、增删数据、排课等功能

系统分为3个子系统,分别为权限子系统、课程子系统、学生子系统,子系统主要提供功能及调用关系如下图:

3.1 架构分析
3.1.1 高可用
对于校内系统,短时间的宕机,保证有限时间内可恢复即可,但数据若出现丢失,恢复时间则不可控或无法实现,所以存储至少做到数据备份,达到高可用级别;计算高可用则不做特殊要求,使用前置负载均衡在业务服务器宕机时能实现手动切换即可
3.1.2 高性能
校内系统,日常用户数量以及使用频率并不会特别高,对高性能无特殊要求
3.1.3 可扩展性
校内系统,业务需求明确,日后改动性小,对可扩展性无特殊要求
3.2 总体架构

1)前置nginx作为负载均衡,对外暴露整体服务
2)采用按业务功能模块化方案,分为3个子系统,分别是学生子系统、课程子系统、权限子系统,子系统之间直接相互调用,不经过nginx
3)数据存储使用mysql,mysql使用InnoDB,读写使用主实例,备实例在主实例宕机时手动切换
4. 详细设计
4.1 核心功能
4.1.1 权限验证
权限验证使用客户端请求Header Authorization携带jwt方案(RS256加密),服务端结合Nginx auth_request模块辅助实现,具体流程如下:

补充:由于jwt一经发放服务端无法令其失效,故新增权限后,用户需退出重新登录刷新权限,否则至多在10min后获得刷新
4.2 关键设计
1)存储高可用
mysql备库通过订阅主库binlog,实现热备,当主节点故障时,主动切换业务服务器中数据库地址
2)计算高性能
将整体系统垂直拆分为三个子系统,负责不同业务功能,不需使用影响性能的分布式锁、分布式事务等功能
使用jwt方案,在客户端中存储用户部分信息,减少反复查询用户信息性能消耗
3)安全
使用非对称加密的jwt,降低密钥存放多处子系统引起的安全风险
子系统端口不对外开放
4.3 设计规范
1)系统使用Go + Gin开发
2)子系统之间调用使用http+json,不通过Nginx代理
3)Mysql使用Innodb引擎,子系统独立数据库,主键原则上使用自增bigint类型
5. 质量设计
5.1 请求跟踪
封装log方法,在客户端生成随机ID存放在请求头,log方法每次均打印出请求ID,用于后期排查问题跟踪子系统之间日志请求,增加系统可观测性
6. 演进规划
第一阶段主要完成用户注册登录、信息管理、权限等功能,约2周开发完成
第二阶段主要完成课程功能,包含课程体系管理、课程信息管理、排课等,约3周完成
第三阶段主要完成学生相关功能,主要包含信息查询、抢课、笔记等功能,约2周完成
第四阶段主要是考试功能,包含考试管理、评分、成绩录入等功能