项目框架图

一、架构图

  前端: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:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑

发送端操作流程
1)创建连接
2)创建通道
3)声明队列
4)发送消息

接收端

1)创建连接
2)创建通道
3)声明队列
4)监听队列
5)接收消息
 
工作模式
1)Work queues:多个消费者共同消费同一个队列的消息。一个消息只会被一个消费者接受,rabbit采用轮询的方式将消息平均的发送给消费者。
2)Publish/Subscribe:每个消费者监听自己的队列。
两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己专用的交换
机。
3)Routing:生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。
4)Topics:生产者将消息发给broker,由交换机根据带统配符routingkey来转发消息到指定的队列。
5)Header:使用header中的 key/value(键值对)匹配队列。
6)RPC:即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:
  a.客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
  b.服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
  c.服务端将RPC方法 的结果发送到RPC响应队列
  d.客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。

 

 

3.实现过程:创建站点-创建模板-创建页面(页面基本信息)-页面预览-页面发布

【查询页面-前端请求响应流程】

 【页面静态化流程】

 

【页面预览】

【页面发布】存储路径:站点路径+网页路径+id

 

 

 

 

 

三、课程发布

 1.需求分析

  教学机构可以添加属于自己的课程,供学生在线学习。分类、增删改查、预览、发布课程

2.相关技术

  【分布式文件系统 - FastDFS】fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用socket,通信速度很快。

 

 

     Tracker Server作用是负载均衡和调度,客户端请求Tracker server采用轮询方式。

  Storage集群采用了分组存储方式。组内的Storage server之间是平等关系,不同组的Storage server

之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内的存储服务器容量最小的那个。
  Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
  客户端与fastDFS采用socket协议通信,可以采用官方提供的java版本的fastDSF-client快速开发

 

 

【Eureka】微服务注册中心。

【Feign远程调用】Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。

  启动类添加@EnableFeignClients注解

  a.启动类添加@EnableFeignClients注解,Spring会扫描标记了@FeignClient注解的接口,并生成此接口的代理
对象
  b.@FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS)即指定了cms的服务名称,Feign会从注册中心获取cms服务列表,并通过负载均衡算法进行服务调用。
  c.在接口方法 中使用注解@GetMapping("/cms/page/get/{id}"),指定调用的url,Feign将根据url进行远程调
用。

 【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都是教学机构,他们都拥有“我的课程”权限,但是两个用户所查询到的数据是不一样的。

  我的课程查询,细粒度授权过程如下:

  1)获取当前登录的用户Id  
  2)得到用户所属教育机构的Id
  3)查询该教学机构下的课程信息
  微服务之间认证:微服务之间进行调用时需要携带JWT。使用Feign拦截器实现远程调用携带jwt。

【Zuul网关】Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服务的安全访问,拦截微服务请求,校验合法性及负载均衡。Zuul的核心就是过虑器,通过过虑器实现请求过虑,身份校验等。

 

 

 

 

3.实现过程

【用户登录】

 

 

 【用户认证】

 

 

 【用户授权】

 

 

 

 

 

 

七、异常处理

  1.自定义异常:自定义错误代码和错误信息,由程序员主动抛出,被springmvc统一捕获。

  2.不可预知异常:不可预知的系统bug,异常类型未RuntimeException类型(运行时异常)。

  3.使用 @ControllerAdvice和@ExceptionHandler注解来捕获指定类型的异常

 八、相关问题

 

posted @ 2020-02-25 14:32  Qmillet  阅读(2798)  评论(0)    收藏  举报