字节青训营抖音APP

                                                           You just work hard, the rest is up to time

GitHub地址:https://github.com/xiaodainiao/TikTokLite

TikTokLite

image-20221027202423203

                                                                                            极简抖音

                                                                                 探索本项目相关文档

目录

上手指南

启动服务

config.yaml中所有host改为本机地址后输入

docker-compose up

即可通过docker快速启动部署服务及相关依赖服务

相关环境

  • golang>= 1.18
  • mysql>=8.0:数据库
  • redis>=7.0.0:缓存
  • minio:对象存储
  • ffmpeg:获取视频封面

技术选型

实现功能

功能说明
基础功能视频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:服务入口

开发整体设计

整体架构图

数据库设计

优化

1. 安全

  1. 引入JWT,进行全局Token管理,高效管理用户Token,并且设置过期时间。
  2. Redis引入redsync锁机制,防止俩个线程同时修改用户信息(例如关注)
  3. Redis引入事务机制,防止多表操作时,只修改一张表。最终导致失败。
  4. 使用参数占位符来构造SQL语句,不使用字符串拼接,避免SQL注入
  5. 用户密码进行MD5加密处理,返回用户基本信息时进行脱敏
  6. 实现鉴权中间件,将鉴权和实际业务分离,对不同的接口设置不同的访问权限
  7. 使用docker整合所有相关依赖服务,便于用户快速部署服务,使用wait-for确保其他依赖服务启动后再启动后端服务

2. 性能

  1. 根据实际业务,Querry语句的需求,合理设置相关索引,保证索引高命中
  2. 引入Redis作为中间件,用来实现对象缓存,提升响应速度,减少IO操作,减少服务器压力
  3. 通过Minio自己搭建对象存储,来存储上传视频,并且将上传的视频生成URL,并将URL放在数据库中,避免存储冗余。
  4. 通过pprof进行性能测试,引入缓存与无缓存之间的性能

3. 项目维护

  1. 项目Git协同,严格遵循成员PR->Review->Merge三步走流程,避免错误代码扩散到其他成员库

  2. 多次迭代目录结构。目录结构清晰,配置单元、日志单元、各模块单元条理分明

  3. 文档管理。修改代码前后,要随时记录文档,跟进开发流程,字最后测试出现问题时,可以找到具体负责人快速解决

性能测试

通过命令 go tool pprof -http=:6060 “http://localhost:8080/debug/pprof/profile?seconds=120” 生成了两个版本的火焰图,左图为v1.0,右图为v1.2版本,通过对比两张详细火焰图,优化后的相同方法调用时间更短(添加了相应的中间件)

未来展望

  • 分布式

    利用grpc作为分布式框架,etcd或zookeeper作为注册中心,将五个模块分别布置到不同的服务器上,通过RPC远程调用的方式,来调用相关的模块的方法,做到分布式处理与解耦

线上地址

  • http://112.74.109.70:8080/

版本控制

  • 该项目使用Git进行版本管理。您可以在repository参看当前可用版本。

贡献者

  • 金浩哲
  • 张建红
  • 刘航
  • 薛寅珊
  • 吴志伟

您也可以查阅仓库为该项目做出贡献的开发者

鸣谢

字节跳动青训营

  • 64
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 44
    评论
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呆鸟_coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值