项目框架图
一、架构图
前端:vue.js
控制层:spring mvc、spring security + oauth2、swagger
业务层:spring、spring data redis 、 spring data rabbitmq
持久层:Mybatis、spring data JPA、druid、spring data mongodb
数据层:MySQL、Mongodb、redis、MQ、Elasticsearch、fastDFS
系统采用nginx进行负载均衡
二、页面管理
1.功能介绍:将页面分成一个一个小页面(头部区域、轮播图、),通过cms去管理这些小页面,当需要更改页面的时候只需要更改某个具体的小页面即可。然后通过web服务(例如Nginx)的SSI技术将多个子页面合并并渲染输出。
2.相关技术
【SSI】
【MongoDB】
Mongodb是非关系型数据库,存储Json格式数据 ,数据格式灵活;
相比课程管理等核心数据CMS数据不重要,且没有事务管理要求;
(模糊)查询
//自定义条件查询测试 @Test public void testFindAll() { //条件匹配器 ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("pageAliase", ExampleMatcher.GenericPropertyMatchers.contains()); //页面别名模糊查询,需要自定义字符串的匹配器实现模糊查询 //ExampleMatcher.GenericPropertyMatchers.contains() 包含
//ExampleMatcher.GenericPropertyMatchers.startsWith()//开头匹配
//条件值
CmsPage cmsPage = new CmsPage(); //站点ID cmsPage.setSiteId("5a751fab6abb5044e0d19ea1"); //模板ID cmsPage.setTemplateId("5a962c16b00ffc514038fafd"); // cmsPage.setPageAliase("分类导航"); //创建条件实例 Example<CmsPage> example = Example.of(cmsPage, exampleMatcher); Pageable pageable = new PageRequest(0, 10);
Page<CmsPage> all = cmsPageRepository.findAll(example, pageable);
System.out.println(all); }
【swagger/Postman】
【proxyTable】基本原理是使用服务端代理解决浏览器跨域(浏览器同源策略不允许跨域访问,所谓同源是指协议、域名、端口相同)。
【FreeMarker】其他常用的模板引擎JSP、Thymeleaf等。模板+数据 = 输出。
【GridFS】GridFS是MongoDB提供的用于持久化存储文件的模块。在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是fifiles,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。
【RabbitMQ】用于任务异步处理、应用程序解耦合(相当于中介)。Springboot默认已集成RabbitMQ,且并发性能好。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑
接收端





3.实现过程:创建站点-创建模板-创建页面(页面基本信息)-页面预览-页面发布
【查询页面-前端请求响应流程】
【页面静态化流程】
【页面预览】
【页面发布】存储路径:站点路径+网页路径+id
三、课程发布
1.需求分析
教学机构可以添加属于自己的课程,供学生在线学习。分类、增删改查、预览、发布课程
2.相关技术
【分布式文件系统 - FastDFS】fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用socket,通信速度很快。
Tracker Server作用是负载均衡和调度,客户端请求Tracker server采用轮询方式。
Storage集群采用了分组存储方式。组内的Storage server之间是平等关系,不同组的Storage server

【Eureka】微服务注册中心。
【Feign远程调用】Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。
启动类添加@EnableFeignClients注解
a.启动类添加@EnableFeignClients注解,Spring会扫描标记了@FeignClient注解的接口,并生成此接口的代理【Ribbon客户端负载均衡】
在消费微服务中使用Ribbon实现负载均衡,Ribbon先从EurekaServer中获取服务列表。Ribbon根据负载均衡的算法去调用微服务
3实现过程
【课程预览】
【课程发布】
四、搜索服务
1.需求分析
分类搜索、关键字搜索、难度等级搜索。。。
2.相关技术
【ES】----
索引结构:逻辑结构部分是一个倒排索引表:将要搜索的文档内容分词,所有不重复的词组成分词列表;将搜索的文档最终以Document方式存储起来;每个词和docment都有关联。
索引库:ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档。它就相当于MySQL中的表,或相当于Mongodb中的集合。
映射:在索引中每个文档都包括了一个或多个fifield,创建映射就是向索引库中创建fifield的过程,下边是document和fifield。与关系数据库的概念的类比:文档(Document)----------------Row记录;字段(Field)-------------------Columns 列;
ES集群管理:ES通常以集群方式工作,这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力,同时也增加了系统的容错能力及高可用。
3.实现过程
head可视化插件
IK分词器:两种分词模式:最细粒度ik_max_word、最粗粒度ik_smart;还可以自定义词库
五、媒资管理
1.需求分析
学生在线观看、用户上传视频、视频处理、视频删除
2.相关技术
【HLS】HLS的工作方式是:将视频拆分成若干ts格式的小文件,通过m3u8格式的索引文件对这些ts小文件建立索引。一般10秒一个ts文件,播放器连接m3u8文件播放,当快进时通过m3u8即可找到对应的索引文件,并去下载对应的ts文件,从而实现快进、快退以近实时 的方式播放视频。
【FFmpeg】对视频进行编码
【播放器】本项目使用H5播放器,使用vedio.js
【断点上传】断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载,断点续传可以提高节省操作时间,提高用户体验性。
【WebUploader】用于完成大文件上传功能
3.实现过程
HLS协议基于Http协议,本项目使用Nginx作为视频服务器。下图是Nginx媒体服务器的配置流程图:
原始视频通常需要经过编码处理,生成m3u8和ts文件方可基于HLS协议播放视频。通常用户上传原始视频,系统自动处理成标准格式,系统对用户上传的视频自动编码、转换,最终生成m3u8文件和ts文件。
六、用户管理
1.需求分析
用户认证和授权、单点登录(只认证一次便可以在多个拥有访问权限的系统中访问)、第三方认证
2.相关技术
【Oauth认证】用于第三方认证。授权模式:授权码模式、密码模式、隐式授权码模式、客户端模式;
【Spring security + Oauth2】完成用户认证和用户授权。Spring security 是一个强大的和高度可定制的身份验证和访问控制框架,Spring security 框架集成了Oauth2协议。
【JWT】传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,并根据令牌获取用户的相关信息,性能低下。JWT定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。
JWT令牌的优点:jwt基于json,非常方便解析;可以在令牌中自定义丰富的内容,易扩展;通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高;资源服务使用JWT可不依赖认证服务即可完成授权。缺点:JWT令牌较长,占存储空间比较大。
传统资源服务授权流程:
令牌结构:Header(头部:令牌的类型和使用的哈希算法)、 Payload(负载:内容也是一个json对象,存放有效信息)、Signature(签名:用于防止jwt内容被篡改)。
方法授权:生成Jwt令牌时在令牌中写入用户所拥有的权限,在资源服务方法上添加注解PreAuthorize,并指定此方法所需要的权限。例如@PreAuthorize("hasAuthority('course_find_list')")
细粒度授权:细粒度授权也叫数据范围授权,即不同的用户所拥有的操作权限相同,但是能够操作的数据范围是不一样的。一个例子:用户A和用户B都是教学机构,他们都拥有“我的课程”权限,但是两个用户所查询到的数据是不一样的。
我的课程查询,细粒度授权过程如下:
【Zuul网关】Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服务的安全访问,拦截微服务请求,校验合法性及负载均衡。Zuul的核心就是过虑器,通过过虑器实现请求过虑,身份校验等。
3.实现过程
【用户登录】
【用户认证】
【用户授权】
七、异常处理
1.自定义异常:自定义错误代码和错误信息,由程序员主动抛出,被springmvc统一捕获。
2.不可预知异常:不可预知的系统bug,异常类型未RuntimeException类型(运行时异常)。
3.使用 @ControllerAdvice和@ExceptionHandler注解来捕获指定类型的异常
八、相关问题