项目-02-基于微服务的在线教育平台设计与实现

一个SpringCloud 组件学习项目.

不要脸的我那这个东西做毕业设计了,逃.

本文会对项目进行一个基本的梳理.

  • **内容简介: 本文主要是对自己的毕业设计–基于微服务的在线教育平台设计与实现 给出 一个简单的介绍. **

  • PS: 若文章字体偏大或者偏小,建议通过 ctrl键+鼠标滑轮 进行修改,以提升阅读效果.(带来不便,请谅解!)

系统架构:

image-20210511144256760

如图示: 本项目采用前后端分离的架构方案.

  • 前端:

    Nginx: 对用户请求进行统一管理, 分发到不同的前端服务中.

    ui-center: 学生中心,维护用户的基本信息,用户学习信息.

    ui-teacher: 教师管理, 用于课程的发布及维护.

    ui-static: 门户页面,显示项目信息.

    ui-search: 搜索页面, 使用nuxt.js实现.

    ui-system: 系统管理界面, 用户权限维护.

  • 后端:

    Zuul: 对用户进行拦截, 放行拥有访问权限的请求到 后端服务中.

    Eureka: 服务注册中心, 用于所有服务的注册与发现.

需求分析:

项目主要包含以下几个模块,用户管理模块,认证与授权模块,文件模块,搜索模块,页面管理模块,视频处理模块,媒资管理模块,在线学习模块。

image-20210511151518996

业务服务模块:

  • 页面管理模块:包含页面添加,页面修改,页面删除,页面预览以及页面发布等功能。

  • 用户管理模块:包含获取用户基本信息,添加用户,修改个人信息等功能。

  • 课程管理模块: 包含管理教学课程、课程教学计划和课程图片等功能.

  • 媒资管理模块:包含查询媒资文件,删除媒资文件,修改媒资信息等功能。

  • 搜索模块:包含查询课程信息,教学计划查询等功能。

  • 在线学习模块:包括用户报名上课,查询用户学习课程信息,用户退出课程学习以及查询课程视频信息的功能。

边缘服务模块:

  • 文件模块:包含图片文件的上传功能。

  • 页面处理模块: 包含 发布页面 功能。

  • 视频处理模块:包含处理视频文件,对视频文件进行格式转换的功能。

  • 认证与授权模块:包括用户登录,用户注册,用户退出,获取用户信息等功能。

详细设计:

在本章节中,只会介绍一下重点内容:

边缘服务模块:

1. 认证与授权
2. 图片文件上传

业务服务模块:

1. 页面预览 与发布页面
2. 课程预览与发布课程
3. 媒资文件上传

边缘服务模块:

认证与授权:

认证与授权模块是对系统访问用户进行管理,目的是保证系统的安全。本模块涉及的角色主要是学生,教师和管理员。

  • 用户登录:

    用户通过前端提交表单,后端系统对数据进行校验,数据校验通过后,系统校验用户信息,用户信息校验通过后,后端系统返回用户令牌给前端并写入Redis数据库。

  • 查询用户令牌信息:

    用户提交请求,Zuul网关对数据进行校验,数据校验通过后,后端系统根据cookie获取用户信息,查询Redis数据库返回用户令牌给前端页面。

auth

  • 认证(authentication): 通过(校验用户名,密码的方式)来判断你就是你.
  • 授权(authorization): 系统授予登录用户与之相对应的权利.
  • 关于认证与授权的更多信息: here!!

本项目中, 通过校验用户名,密码 对用户身份进行认证,认证成功后, 将用户在本系统中的权限信息保存在JWT(JSON Web Token) 中,返回给用户.

这样做的原因:

  • 由于微服务项目的特点,将不同的业务拆分到不同的web服务器中,若按照传统思路(将用户信息放入 Session中), 那么 每一次用户请求都需要去AuthServer 去判断用户权限, 导致服务器压力过大.而采用Spring Security +JWT +Redis 的方式, 将用户访问authServer的请求转移到 Redis中.(同样配置下, Redis 可以处理的请求数远远多于Tomcat处理请求数)

方法请求调用:

  • 第一次请求:

    request -> zuul -> 认证与授权服务器 AuthServer-> 用户服务器 UCenterServer -> Redis-> response

  • 第二次请求:

    request -> zuul -> Redis -> 业务服务器 -> response

优势:

利用Spring Security +JWT +Redis 的方案 ,合理解决了单点登录与权限校验问题.

图片文件上传服务:

文件模块主要功能是上传图片文件到FastDFS中,目的是加快系统对图片文件的访问速度,并从一定程度上保证系统的高可用。模块涉及的角色是教师与学生。

a

原因:

Tomcat 可以用于存储图片, 但是会加大tomcat 的访问请求, 所以选择FastDFS 分布式文件系统来存储图片.

PS: 愚蠢的决定,应该选择 阿里云OSS 服务, 原因在性能分析部分后面细说.

参考: Here

方法请求调用链:

request -> 图片文件服务 -> FastDFS -> MongoDB

业务服务模块:

页面管理:

页面预览:

管理员用户发起预览页面请求给后端系统,后端系统利用FreeMarker提供的静态化技术,拼装页面模板和页面数据信息作为结果返回给前端页面。

pagepre

页面发布:

管理员用户发起发布页面请求给后端系统,系统利用FreeMarker提供的静态化技术,拼装页面模板和页面数据信息生成HTML页面保存在GridFS中,再利用RabbitMQ将页面下载到前端服务器中,完成页面发布功能。

pagepub

课程管理:

课程预览:

教师用户发起课程预览请求,后端系统通过查询数据库获取该课程的相关信息,将课程详情页面信息写入数据库中,返回课程详情页面预览URL给前端页面。

coursepre

课程发布:

教师用户发起课程发布请求,后端系统通过查询数据库获取该课程的相关数据信息,利用Feign发起请求调用页面管理模块中的页面发布功能,将发布的课程详情页面信息写入数据库,通过Logstash采集信息到ElasticSearch中,便于用户查询课程信息。

coursepub

媒资文件上传:

media

图为媒资文件上传时序图, WebUploader发送注册请求以校验上传文件,后端校验上传文件信息,并做出相应。若上传文件不存在,WebUploader发送校验分块文件信息请求,后端校验分块文件信息,若分块文件已存在,返回提示信息。否则,WebUploader上传分块文件。

当分块文件上传完毕时,WebUploader发送合并文件请求,后端系统合并分块文件。合并完成后,后端将文件信息写入MongoDB数据库中,并发送消息通知视频处理模块处理媒资文件。

性能分析:

生产环境:

  • OS : windows 10 64bit
  • CPU: i5-4210m 2.6GHz
  • RAM: 11.9G

情况说明:

image-20210511144256760

微服务:

由于微服务应用众多, 本项目会存在内存吃紧的情况(尤其是开发阶段).所以自己对每一个微服务应用的堆大小进行了限制,恒定128MB.

图片存储:

我的方案: 利用虚拟机VMware 中1G内存的centos 6 32bit 的os搭建 FastDFS, 进一步导致内存吃紧.

最好的解决方案: 花钱, 阿里云OSS存储服务

视频处理模块:

由于CPU过于 拉胯, 在单元测试过程中,视频处理(即视频格式从mp4 转换到m3u8)功能运行速度过慢.只能选择1视频多用的思路.

最好的解决方案: 花钱, 阿里云OSS存储服务

ElasticSearch:

使用ElasticSearch 的目的是限制普通用户的访问数据,以及加快搜索速度(避免使用mysql模糊查询时带来的全表扫描的问题) .

坏处: 这个东西,贼占内存, java程序, 默认堆大小是1G, 考虑到我的是测试环境,直接堆大小减到256m.

前端Web页面:

我的方案:在保证前端页面基本无错误的情况, 利用node.js 打包成静态页面,然后 通过NGINX进行路径映射,然后实现访问.

缺点:慢的一批.

好处: 可以勉勉强强的运行整个项目(除去视频处理服务).

性能测试?

对于本台机器而言,连正常运行都是勉强做到.不存在性能测试一说.

项目运行示图

开发日志列表

image-20210511175517832

总结:

  • 免费就是最大的付费. 这个结论在图片服务以及视频处理服务最为明显,若采用 云存储 图片视频文件(比如阿里云OSS服务), 会给本地运行环境节省1G 左右的内存, 将大大加强系统的流畅性与稳定性.
  • 通过这个项目让我认识到, 系统运行的高度,取决于 整个系统运行过程中最慢的服务或是中间件, 本项目而言, Tomcat 无疑是访问速度最慢的.

优点:

  • 为了保障系统安全性,采用Spring Security OAuth2+JWT +Redis的技术方案,实现用户认证与授权功能,解决单点登录与权限校验问题。
  • 为了保障在线学习模块可用性,采用FFmpeg+HLS协议的技术方案,实现了大视频文件近实时播放的功能,保障了在线学习模块的稳定性。
  • 为了保障项目的稳定运行,对后端服务模块进行了JVM参数优化,并使用RabbitMQ将耗时服务进行异步调用,大大提高了系统的可用性。
  • 为了提高系统的检索速度, 对普通用户采用ElasticSearch+Logstach+MySQL 技术方案搭建全局搜索引擎,大大提高了系统的检索速度
  • 为了提高系统的访问速度, 采用 FastDFS文件系统用以存储图片文件,大大减少了后端服务器的访问压力.

总之,本项目中所搭建的在线教育平台已具备一个在线教育平台的基本功能,可以给用户提供稳定,可靠的学习环境。

TODO:

在线教育平台功能及技术应用仍有诸多不足和改进空间,如下:

(1)系统中日志未进行统一收集分析, 可以利用Spring Boot 集成ELK(Elasticsearch,Logstash,Kibana),提供一个统一的日志分析解决方案。

(2)系统尚未通过docker进行部署,没有备案,只能提供在本地运行。

(3)受限于当前计算机性能,并未对系统做性能测试。

(4)系统未处理RabbitMQ消息丢失,消息重复等问题。

参考:

[1] 王雪涛,刘伟杰.分布式文件系统[J].科技信息(学术研究),2006(11):406-407.

[2] 陈新元.基于ElasticSearch的语料库教学方案的设计与实现[J].福建轻纺,2020(05):12-15.

[3] 张祥俊,伍卫国.基于FastDFS的数字媒体系统设计与实现技术研究[J].计算机技术与发展,2019,29(05):6-11.

[4] 洪传旺. 基于Spring Cloud的“微课堂”知识考核系统的设计与实现[D].南京大学,2019.

[5] 薛良. 基于云服务的教师教学网站的设计与实现[D].电子科技大学,2015

[6] 孙浩. 基于SpringMVC及MyBatis框架的在线教育平台的设计与实现[D]. 2019.

[7] 辛园园, 钮俊, 谢志军,等. 微服务体系结构实现框架综述[J]. 计算机工程与应用, 2018, 054(019):10-17.

[8] 张宇, 王映辉, 张翔南. 基于Spring的MVC框架设计与实现[J]. 计算机工程, 2010(04):65-68.

[9] 祝智庭, 刘名卓.”后MOOC”时期的在线学习新样式[J]. 开放教育研究, 2014, 000(003):36-43.

[10] 杨扬, 侯红, 郝克刚. 基于容器的IoC控制反转模式的研究[J]. 计算机应用与软件, 2009(04):23-25.

[11] 张海藩. 软件工程导论(修订版)[M]// 软件工程导论(修订版). 清华大学出版社, 1992.

[12] 蒋侃, 张开宇, 林玉峰. 基于SaaS的高校创业教育服务平台设计[J]. 中国教育技术装备, 2011(24):89-91.

[13] Alshuqayran N,Ali N,Evans R. A Systematic Mapping Study in Microservice Architecture. Service-Oriented Computing and Applications(SOCA) . 2016

[14] 赖歆. 一种基于Spring Cloud实现的微服务框架[J]. 数字化用户, 2018, 024(029):218.

[15] 余建波. 三大MOOC平台比较及启发[J]. 中国教育网络, 2013(9):21-22.

[16] Fowler M, Lewis J. Microservices a definition of this new architectural term[J]. URL: http://martinfowler. com/articles/microservices. html, 2014: 22..

[17] O’HaraJohn. Toward a Commodity Enterprise Middleware[J]. Queue, 2007.

[18] 邱生姬. 浅谈JAVA微服务SpringCloud开发[J]. 电脑迷, 2017, 000(017):50.