这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
成果展示
- 后端服务器部署地址
- 项目github地址
- 手机演示视频
- 实现功能
| 功能项 | 说明 |
|---|---|
| 视频Feed流、视频投稿、个人信息 | 支持所有用户刷抖音,按投稿时间倒序推出,用用户可以自己拍视频投稿,查看自己的基本信息和投稿列表 |
| 点赞列表、用户评论 | 登录用户可以对视频点赞,并在视频下进行评论,在个人主页能够查看点赞视频列表。 |
| 关注列表、粉丝列表 | 登录用户可以关注其他用户,能够在个人信息页查看本人的关注数和粉丝数,点击打开关注列表和粉丝列表。 |
小组分工
- 数据库设计
- 接口测试
-
app测试方法
-
app测试本地接口方式:
- 用自己手机连接本地局域网,并运行go项目,让其通过防火墙
- 设计安装apk文件,并长按“我的”,设置电脑局域网ip地址和端口
-
app测试远程调试方法:
- 长按“我的”,设置地址
-
- 安全性设计
- Readme文档:
-
接口分工
- 实现了APP所有的接口,所有的接口测试通过
项目介绍
系统架构
目录结构
-
docs
- postman-export:postman接口测试文件导出
- sql:数据库初始化sql和运维sql
-
src
-
api
- controller:控制器
- router.go:路由器控制
-
cache
- user_id:通过用户id缓存用户数据
- user_uname_pwd:通过用户名密码缓存用户数据
-
dao:数据访问层,与数据库相关的操作
-
global:全局变量
-
pkg
- errcode:统一错误码
- setting:配置文件映射
-
pojo
- entity:数据层对象,映射数据库表
- vo:视图层对象,映射接口返回对象
-
service:项目核心业务逻辑
-
util:工具类
-
config.yaml:配置文件
-
init.go:初始化加载文件
-
server.go:启动类
-
相关优化
对象存储
- 使用阿里云 OSS 对象存储对视频进行存储,使用在线截图工具截取视频封面,通过网络IO流转存图片,返回视频和和图片的访问链接
JWT权限认证
- 使用 JWT对用户进行权限认证,在服务器端保管密钥,并控制 token 有效时间
GO协程优化
-
使用 Go 协程并行查询数据库信息,使得原本封装视频 feed 流信息等需要多条 sql 的操作的需求,简化为只需要2~3条 sql 操作就能完成
- 服务端向数据库同时发送 2~3 条 sql,在服务端对返回结果进行异步封装,节省了网络传输的时间
- 定义计时器,如果超时直接返回错误码,提高接口反应速度
自定义缓存
-
自定义缓存,手动实现 LRU 缓存算法,将用户信息进行在服务端缓存,避免频繁查询数据库
- 保证并发安全,新增节点、删除节点等操作进行加锁
- 保证数据一致性,当关注/取消关注等操作导致用户信息变化时,删除缓存中的用户数据,等下次查询的时候再从数据库中获取最新数据加到缓存中
数据库事务
-
使用数据库事务保证同时对多张表进行操作正确
- 同时操作多张表数据,如果其中一个出错,事务进行回滚操作
- 保证数据有效性,服务端控制不能重复点赞、重复关注、自己关注自己等操作
- 使用CAS操作,保证数据一致性,避免频繁操作导致数据异常
SQL预编译
- 项目中的SQL语句全部实现了预编译,防止SQL注入风险
数据库设计
-
详细设计
-
dy_user表 用户表 | 字段名 | 类型 | 说明 | | -------------- | ----------- | -------- | | id | bigint | | | username | varchar(40) | | | password | varchar(40) | | | follow_count | int | 关注其他用户个数 | | follower_count | int | 粉丝个数 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |
-
dy_video | 字段名 | 类型 | 说明 | | -------------- | ------------ | ------ | | id | bigint | | | user_id | bigint | | | play_url | varchar(255) | 视频链接 | | cover_url | varchar(255) | 封面链接 | | favorite_count | int | 点赞个数 | | comment_count | int | 评论数 | | title | varchar(255) | 视频标题 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |
- dy_comment 评论表 | 字段名 | 类型 | 说明 | | ----------- | ------------ | ------- | | id | int | | | video_id | bigint | 评论的视频id | | user_id | bigint | 评论的用户 | | content | varchar(255) | 评论内容 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |
- dy_favorite 点赞表 | 字段名 | 类型 | 说明 | | ---------- | ------- | ------ | | id | int | | | user_id | bigint | | | video_id | bigint | | | is_deleted | tinyint | |
-
dy_relation 关系表 | 字段名 | 类型 | 说明 | | ------------ | -------- | ------------- | | id | int | | | follower_id | bigint | 用户id | | following_id | bigint | 对方的id | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | 数据存在则用户关注了这个人 |
-
学习资料: