这是我参与[第五届青训营]伴学笔记创作活动的第16天
主要三个部分
- 需求介绍
- 架构设计
- 功能测试
一、 需求介绍
具体的功能包括视频投稿、发布列表以及视频流。用户在进行刷操作时客户端会进行Feed流的获取并同步当前视频作者的投稿列表。用户可以通过发布按钮将视频发布分享。
1、 视频投稿
接受参数:用户鉴权token、视频流数据data、视频标题title
请求类型:POST /douyin/publish/action
请求体:JSON数据
响应体:状态码status_code 返回状态status_msg
2、 发布列表
接受参数:用户鉴权token、目标用户id
请求类型:GET /douyin/publish/list
请求体:JSON数据
响应体:状态码status_code 返回状态status_msg video_list
3、 视频流
不限制登录状态,返回按投稿时间倒序的视频列表,视频数量由服务端控制,单次最多30个
接受参数:lastest_time(可选参数,限制返回视频的最新投稿时间)、用户鉴权(可选参数)token
请求类型:GET /douyin/feed
请求体:JSON数据
响应体:状态码status_code 返回状态status_msg video_list
二、 架构设计
1、整体架构设计
采用分层架构,客户端发送请求后,首先进行统一鉴权,鉴权成功后controller层对请求层进行响应并解析请求中的数据,将数据传入service层进行数据处理并调用dao层与数据库、FTP服务器进行交互
2、详细设计
(1)视频投稿
登录用户选择视频上传
1 鉴权(判断用户是否登录)
(1)如果已经登录,进入2
(2)如果未登录,则返回status_code=0 status_msg = "投稿失败,您未登录"
2 判断用户视频数据或者视频标题是否为空
(1)只要有一个为空则返回status_code=0 ,status_msg = "投稿失败,请保证填写必要数据"
(2)都不为空,进入3 ,并且返回status_code=1 ,status_msg = "投稿成功"
3把视频数据存放在后台
4添加记录到数据库
5返回给前端status_code status_msg
(2)发布列表
登录用户的视频发布列表,直接列出某个用户所有投稿过的视频。
1 鉴权(判断用户是否登录)
(1)如果已经登录,进入2
(2)如果未登录,则返回status_code=0 status_msg = "请先登录"
2 根据id查询目标用户信息 author
(1)如果查不到则返回status_code=0 status_msg = "目标用户不存在"
(2)如果能查到,则进入3
3.从数据库中查询符合条件的视频
4.封装到video_list中
5返回给前端status_code = 1 status_msg="查询成功" ,video_list
(3)视频流
不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个
1.查询前30个最新时间 Video:
问题:(1)如何查询前30个? (2)如何拿到这30个中的最后一个?
2.封装到video_list中
3.返回给前端status_code = 1 status_msg="查询成功"
3、性能优化
3.1概述
在原有的架构中,主要存在两点问题
- 视频投稿列表存在大量的同步调用,在进行视频信息拼装时,大量同步调用会导致缓慢,用户体验较差
- 视频和图片存放在本地服务器,耦合性较高。
改进方式如下:
- 采用go语言的协程将原有同步流程异步化,提升程序性能
- 为了实现解耦,搭建FTP服务器存储视频资源,并通过SSH的方式远程调用ffmpeg截取视频关键帧
- 将FTP与SSH的链接方式改为长连接,去掉每次调用方法所需要的初始化时间
暂时无法在飞书文档外展示此内容
3.2优化详细流程
在原有流程中,每次上传视频需要建立FTP链接并验证身份,为提高响应时间建立长链接
为了实现解耦,服务端通过SSH连接远程调用服务器ffmpeg来进行截图,同时在SSH中执行长链接节省登录验证时间
为了提升执行效率,利用go协程将视频截图服务和数据库操作进行异步操作。
暂时无法在飞书文档外展示此内容
三、功能测试
视频-视频投稿
需求:登录用户投稿视频
POST http://localhost:8080/douyin/publish/action/
header : Content-Type multipart/form-data
返回值
{
"status_code": 0,
"status_msg": "1_bear1.mp4 uploaded successfully"
}
视频上传后会保存到本地 public 目录中
访问时用 127.0.0.1:8080/static/1_bear1.mp4 即可
视频-视频流
需求:查询最新的30个稿件(并未选择参数lastest_time、token)
GET http://localhost:8080/douyin/feed/
返回值
{
"status_code": 1,
"status_msg": "查询成功",
"video_list": [
{
"id": 102,
"author": {
"id": 23,
"name": "葵司",
"follow_count": 97,
"follower_count": 90
},
"play_url": "zc",
"cover_url": "sad",
"favorite_count": 1,
"comment_count": 1,
"is_favorite": 1,
"title": "aaa"
},
{
"id": 101,
"author": {
"id": 1,
"name": "松本一香",
"follow_count": 72,
"follower_count": 43
},
"play_url": "public\1_bear1.mp4",
"cover_url": "unknown",
"title": "test"
},
。。。。。相似已省略
]
}
视频-发布列表
需求:查询某个用户发布过的所有视频
GET http://localhost:8080/douyin/publish/list?token=曹弘文&userId=1
返回值
{
"status_code": 1,
"status_msg": "查询成功",
"video_list": [
{
"id": 1,
"author": {
"name": "松本一香",
"follow_count": 72,
"follower_count": 43
},
"play_url": "public\1_bear1.mp4",
"cover_url": "unknown",
"title": "test"
}
]
}