/TikTokLite

字节青训营抖音APP

Primary LanguageGo

                                                           You just work hard, the rest is up to time

个人简介

  • 学生一枚,热爱编程,从0学c++,自己深有体会,目前学过c++,go,python,数据库,分布式等。个人热爱开源,希望自己学的知识可以和大家共享,并且一起不断进步。
  • 后续打算学分布式框架,以及相关的技术。一些文章也会同步到博客,如果有需要的小伙伴,可以去博客自取。

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远程调用的方式,来调用相关的模块的方法,做到分布式处理与解耦

线上地址

版本控制

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

贡献者

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

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

鸣谢

字节跳动青训营