![](https://i-blog.csdnimg.cn/blog_migrate/034bf0011a974c9a312532f562004e31.jpeg)
You just work hard, the rest is up to time
GitHub地址:https://github.com/xiaodainiao/TikTokLite
TikTokLite
![image-20221027202423203](https://i-blog.csdnimg.cn/blog_migrate/d9a86a9b07045d82fbe92cd8965f386e.png)
极简抖音
目录
上手指南
启动服务
将config.yaml
中所有host改为本机地址后输入
docker-compose up
即可通过docker快速启动部署服务及相关依赖服务
相关环境
- golang>= 1.18
- mysql>=8.0:数据库
- redis>=7.0.0:缓存
- minio:对象存储
- ffmpeg:获取视频封面
技术选型
![](https://i-blog.csdnimg.cn/blog_migrate/79381b28f21c18ee0790128901dae9e5.png)
实现功能
功能 | 说明 |
---|---|
基础功能 | 视频feed流、视频投稿,个人信息、用户登录、用户注册 |
扩展功能一 | 视频点赞/取消点赞,点赞列表;用户评论/删除评论,视频评论列表 |
扩展功能二 | 用户关注/取关;用户关注列表、粉丝列表 |
目录结构
.
├── common
│ ├── AuthMiddleware.go
│ ├── cache.go
│ └── dbInit.go
├── config
│ └── config.go
├── config.yaml
├── controller
│ ├── commentController.go
│ ├── favortiteController.go
│ ├── feedController.go
│ ├── publishController.go
│ ├── relationController.go
│ └── userController.go
├── docker-compose.yml
├── Dockerfile
├── go.mod
├── go.sum
├── log
│ └── log.go
├── main.go
├── minioStore
│ └── minioClient.go
├── proto
│ ├── pkg
│ │ ├── comment.pb.go
│ │ ├── favorite.pb.go
│ │ ├── feed.pb.go
│ │ ├── login.pb.go
│ │ ├── publish.pb.go
│ │ ├── register.pb.go
│ │ ├── relation.pb.go
│ │ └── user.pb.go
│ └── proto
│ ├── comment.proto
│ ├── favorite.proto
│ ├── feed.proto
│ ├── login.proto
│ ├── publish.proto
│ ├── register.proto
│ ├── relation.proto
│ └── user.proto
├── README.md
├── redis.conf
├── repository
│ ├── commentModel.go
│ ├── favoriteModel.go
│ ├── relationModel.go
│ ├── userModel.go
│ └── videoModel.go
├── response
│ └── response.go
├── routes
│ ├── comment.go
│ ├── favorite.go
│ ├── publish.go
│ ├── relation.go
│ ├── routes.go
│ └── user.go
├── service
│ ├── commentService.go
│ ├── favoriteService.go
│ ├── feedService.go
│ ├── publishService.go
│ ├── relationService.go
│ └── userService.go
├── TikTokLite.sql
├── util
│ └── util.go
└── wait-for.sh
common
:中间件、数据库初始化config
: 读取配置controller
:视图层,处理前端消息log
:zap日志组件进行封装minioStore
:对象存储服务,生成视频对外访问连接proto
:前端消息结构体,由protobuf
文件自动生成repository
:数据层,直接对数据库进行操作response
:对返回消息进行封装routes
:路由层service
:逻辑层,执行业务操作,从数据层获取数据,封装后返回试图层uitl
:工具函数TikTokLite.sql
:数据库建表文件config.yaml
:配置文件redis.conf
:redis配置文件main.go
:服务入口
开发整体设计
整体架构图
![](https://i-blog.csdnimg.cn/blog_migrate/4e2503fae8767d5e234622f60b2512ed.png)
数据库设计
![](https://i-blog.csdnimg.cn/blog_migrate/b82345355099116281386023791aeeec.png)
优化
1. 安全
- 引入JWT,进行
全局Token管理
,高效管理用户Token,并且设置过期时间。 - Redis引入
redsync锁
机制,防止俩个线程同时修改用户信息(例如关注) - Redis引入
事务
机制,防止多表操作时,只修改一张表。最终导致失败。 - 使用参数占位符来构造SQL语句,不使用字符串拼接,
避免SQL注入
- 用户密码进行
MD5加密
处理,返回用户基本信息时进行脱敏
。 - 实现
鉴权中间件
,将鉴权和实际业务分离,对不同的接口设置不同的访问权限 - 使用
docker
整合所有相关依赖服务,便于用户快速部署服务,使用wait-for确保其他依赖服务启动后再启动后端服务
2. 性能
- 根据实际业务,Querry语句的需求,合理
设置相关索引
,保证索引高命中 - 引入
Redis
作为中间件,用来实现对象缓存,提升响应速度,减少IO操作,减少服务器压力 - 通过
Minio
自己搭建对象存储,来存储上传视频,并且将上传的视频生成URL,并将URL放在数据库中,避免存储冗余。 - 通过
pprof
进行性能测试,引入缓存与无缓存之间的性能
3. 项目维护
-
项目
Git协同
,严格遵循成员PR->Review->Merge三步走流程,避免错误代码扩散到其他成员库 -
多次迭代目录结构
。目录结构清晰,配置单元、日志单元、各模块单元条理分明 -
文档管理。修改代码前后,要随时记录文档,跟进开发流程,字最后测试出现问题时,可以找到具体负责人快速解决
性能测试
通过命令 go tool pprof -http=:6060 “http://localhost:8080/debug/pprof/profile?seconds=120” 生成了两个版本的火焰图,左图为v1.0,右图为v1.2版本,通过对比两张详细火焰图,优化后的相同方法调用时间更短(添加了相应的中间件)
![](https://i-blog.csdnimg.cn/blog_migrate/52295b39676a6d81ca20dd9bdc56570f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6bf79795e65e8e9b207baf9c2a5a62d5.png)
未来展望
-
分布式
利用grpc作为分布式框架,etcd或zookeeper作为注册中心,将五个模块分别布置到不同的服务器上,通过RPC远程调用的方式,来调用相关的模块的方法,做到分布式处理与解耦
![](https://i-blog.csdnimg.cn/blog_migrate/cbc9566f685c2de8802d42a2b885791e.png)
线上地址
- http://112.74.109.70:8080/
版本控制
- 该项目使用Git进行版本管理。您可以在repository参看当前可用版本。
贡献者
- 金浩哲
- 张建红
- 刘航
- 薛寅珊
- 吴志伟
您也可以查阅仓库为该项目做出贡献的开发者