由于Java生态庞大且复杂,各种术语技术栈层出不穷,为了避免学一个技术做一个Demo的情况,也为了增长项目经验,希望做一个项目能够整合生态中的技术,YouVideo因此诞生…
YouVideo是一个视频项目,也可以理解成传统的电商项目,除了基本的登录退出,后台管理之外,项目中的“付费视频”可以认为是电商系统中的商品,同样包含订单模块,使用乐观锁解决幂等问题,使用fastDFS做图片存储,mongoDB和GridFS里面都存了什么?前后端分离之后要如何协调?与之配套的CMS又是什么?大量已知,未知功能,需在探索项目中发现…
一.YouVideo是个什么样的项目? 1.1背景随着互联网的发展,人们不用在被动的接受电视播放的内容和令人烦躁的广告,用户可以主动的选择自己所感兴趣的内容,同时催生新生行业自媒体,从而出现了不少优秀的UP主,为人们带来生动有趣的视频,丰富了人们的生活。
根据百度百科发布的数据显示,2019年blibili营业额达到67.78亿元 人民币,未来市场规模保持高速增长,而YouTube更是达到了1059亿!
YouVideo借鉴了Bilibili,YouTube的设计思想,是一个提供在线视频服务的平台,满足用户的视频需求。
当前市场的在线模式多种多样,包括:B2C、C2C、B2B2C等业务模式,YouVideo采用B2B2C业务模式,即向企业或个人提供在线视频平台。
YouVideo在线视频平台,平台包括:门户、视频中心 、视频管理中心、CMS静态资源管理中心等子系统。
1.2项目的功能模块YouVideo是一个在线视频平台,平台包括:门户、视频中心、视频管理中心、CMS系统管理 中心等子系统。
门户是整个平台的入口,功能包括:门户首页、注册/登录、视频搜索、客服等。
视频播放中心为用户提供在线观看服务,包括:我的视频、视频点播、评论等功能;
视频后台中心为个人提供视频管理功能,包括:媒资管理、视频信息管理;
CMS系统管理中心提供系统配置CRUD,页面发布,页面预览等功能;
门户:
CMS:
视频后台(媒资管理):
视频后台(我的视频):
视频列表页:
视频详情页:
前后端分离技术架构,前端采用vue.js构建,服务端采用Spring Cloud微服务架构,系统分为用户层、 CDN(本项目未体现)、负载均衡、前端UI、微服务层、数据层、接口层及DevOps等部分组成
服务模块有CMS,用户中心,订单模块,搜索模块,授权模块,视频模块等
前端有门户,视频列表,视频后台管理系统,CMS管理系统 下图是完整的技术架构图:
业务流程举例:
1、用户可以通过客户端访问系统进行在线学习。
2、 系统应用 CDN(本项目未体现) 技术,对一些 图片、CSS样式文件、视频 等资源从 CDN 调度访问。
3、所有的请求全部经过负载均衡器。
4、对于客户端请求,首先请求UI层,渲染用户界面。
5、客户端UI请求服务层获取进行具体的业务操作。
6、服务层将数据持久化到数据库
所有微服务基于Spring Boot、Spring Cloud构建
1)控制层: Spring MVC、Spring Security Oauth2 、Swagger
2)业务层: 事务控制:Spring 任务处理:Spring Task
数据缓存:Spring Data Redis 消息队列:Spring RabbitTemplate
搜索: Elasticsearch
-
持久层: 操作MySQL:MyBatis、com.alibaba.druid(采用druid-spring-boot-starter)Spring Data Jpa
操作MongoDB:Spring Data Mongodb -
数据层,采用MySQL和MongoDb存储数据,MySQL存储用户、Video等系统核心信息,MongoDB存储
cms、配置信息等。
项目架构设立接口层,接口层使用swagger注解描述接口的内容,接口定义规范如下:
1、请求get 请求时,前端请求key/value串,SpringMVC采用基本数据类型(String、Integer等)或自定义类型接收。 Post请求时,前端请Form表单数据(application/x-www-form-urlencoded)和Json数据(ContentType=application/json)、多部件类型数据(multipart/form-data),对于Json数据SpringMVC使用 @RequestBody注解解析请求的json数据。
2、响应
响应结果统一信息为:是否成功、操作代码、提示信息及自定义数据。
响应结果统一格式为json。
两台Eureka Server互相注册
2.4 网关网关的作用是负载均衡、路由转发、请求过虑等。
项目中网关与Nginx配合使用
YouVideo使用的Spring全系列框架,由SpringBoot作为基础工程,包括基础通用模块
yv-framework-common 存放常量
yv-framework-model 存放实体类
yv-framework-parent 存放pom
yv-framework-utils 存放工具类
Eureka Sever
yv-govern-center Eureka 注册中心
。。。
1.所有的微服务开发采用Spring Boot开发
2.MQ使用Spring AMQP组件
3.数据层使用Spring Data JPA、Spring Data MongoDB、Spring Data redis。
4.业务层使用Spring来控制本地事务,还使用了Spring Task任务调度框架
5.控制层使用SpringMVC、Sprnig Security Oauth2。
6.微服务管理使用Spring Cloud的Eureka注册中心,微服务之间调用使用Ribbon和Feign Client完成。
7.使用Zuul网关完成微服务安全验证
1.每个微服务使用Spring Boot开发,每个微服务工程包括了web、service、dao三层:
a、web层使用Spring MVC实现,对外暴露API接口给前端调用。
b、service层就是根据业务逻辑编写JavaBean,并使用Spring的声明式事务控制方式来控制事务。
c、dao层就是数据访问接口,来访问MySQL和Mongodb,访问MySQL使用Spring Data JPA和Mybatis,访问 mongodb使用Spring data mongodb。
2.微服务开发完成要向Eureka注册中心注册,以便被其它微服务查找和访问。
3.微服务与微服务之间使用feign来调用,需要在接口上声明@FeignClient注 解,Spring底层会产生动态代理对象,使用ribbon客户端完成调用。
4.前端访问微服务需要通过网关,网关使用Nginx和Zuul来实现,Nginx是最前边的负载均衡,通过Nginx之后便到达了Zuul,项目中Zuul的功能是过虑用户请求,
判断用户身份,对于一些对外公开的微服务则需要经过Zuul,直 接通过Nginx负载均衡访问。
项目中使用Spring Data JPA和MyBatis都是用来访问MySQL,但是它们的分工不同: Spring Data JPA是Spring 提供的一套JPA接口,使用Spring Data JPA主要完成一些简单的增、删、改、查功能。
对于复杂的查询功能会使用MyBatis编写SQL语言来实现,因为使用Spring Data JPA来做一些复杂的查询是没有 MyBatis方便的,Spring Data JPA是面向的对象,而MyBatis直接面向SQL语句
1、视图层在前端和服务端都存在。
2、前端视图采用vue.js+elementUI
3、服务端都是暴露的rest接口,统一用json展示数据。
1、接口定义
使用SpringMVC编写Controller方法,对外暴露Http接口,在Controller方法上使用RequestMapping、 PostMapping、GetMapping等注解定义Http接口。
2、数据格式
请求: get 请求时,前端请求key/value串,SpringMVC采用基本数据类型(String、Integer等)或自定义类型接收。 Post请求时,前端请Form表单数据(application/x-www-form-urlencoded)和Json数据(ContentType=application/json)、多部件类型数据(multipart/form-data),对于Json数据SpringMVC使用 @RequestBody注解解析请求的json数据。
响应: 统一响应json格式。
3、实现
json格式数据SpringMVC采用FastJson解析为对象。非json格式数据SpringMVC提供参数绑定的方法,将key/value或Form-Data数据转换为对象或基本数据类型的变量。
前端工程大多为单页面应用(SPA),采用vue.js框架开发,搜索功能前端采用nuxt.js服务端渲染(SSR)框架开发。
技术栈包括:
1、node.js
2、vue.js
3、npm/cnpm
4、webpack
5、axios
6、nuxt.js
7、element-ui
CMS (Content Management System)即内容管理系统,本项目对CMS系统的定位是对各各网站(子站点)页面的管理,本项目的CMS系统不去管理每个子网站的全部资源,比如:图片、CSS、html页面等,主要管理由于运营需要而经常变动的页面,从而满足根据运营需要快速开发、上线的需求。
功能包括:
1、站点管理,站点就是本项目各各子网站,站点信息包括:站点名称、站点域名、端口、服务器物理路径等。
2、模板管理,由于要对页面进行静态化,使用freemarker引擎技术,所以需要定义模板。
3、页面管理,包括:页面添加、页面修改、页面删除等操作。
4、页面预览,对页面静态化,在浏览器预览页面静态化内容。
5、页面发布,将页面静态化后发布到所属站点服务器。
GirdFS是什么?工作原理是什么?
GridFS 是 MongoDB 提供的用于持久化存储文件的模块,它可以作为分布式文件系统使用,CMS 子系统将页面文件、模板文件存储到 GridFS 中,由于本项目使用 MongoDB,选用 GridFS 可以快速集成开发。
它的工作原理是:
在 GridFS 存储文件是将文件分块存储,文件会按照 256KB 的大小分割成多个块进行存储,GridFS 使用两个集合(collection)存储文件,一个集合是 chunks, 用于存储文件的二进制数据;一个集合是 files,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。
从 GridFS 中读取文件要对文件的各个块进行组装合并。
使用方法是:
使用 Spring data mongodb 包下提供的 GridFsTemplate 访问 GirdFS。
gridFsTemplate.findone() 查询文件 gridFsTemplate.delete() 删除文件 gridFsTemplate.store()存储文件
持续更新。。。



