代码拉取完成,页面将自动刷新
同步操作将从 0202zc/tiktok 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
基于 “Hertz/Gin HTTP框架 + Kitex 微服务框架” 完成的第五届字节跳动青训营—极简版抖音项目
本项目包含三大类接口:基础接口、互动接口、社交接口。采用微服务架构以及 Docker 部署的方式。总共需要 16G 存储空间,1 台服务器,项目中所需要的数据库以及中间件均由 Docker 下载并挂载运行。
以下是开发文档。
由于抖音的各接口之间耦合度不高,故采用微服务的架构,分为 HTTP、RPC 和 DAL 三层:
当客户端发来 HTTP 请求时,HTTP 层会调用 RPC层 的 RPC Client,然后 RPC Client 去 ETCD 中心寻找已经注册的对应的微服务,交给 RPC Server 处理。RPC Server 会去调用 DAL 层的数据库,数据库处理完毕后把结果返回给 RPC Server,RPC Server 将其返回给 RPC Client,最后 RPC Client 返回给 Hertz 并由 Hertz 返回 HTTP 响应结果。
目录 | 子目录 | 说明 | 备注 |
---|---|---|---|
cmd | api | api 服务代码 | 包含http server 和 RPC client |
comment | comment 微服务代码 | ||
favorite | favorite 微服务代码 | ||
message | message 微服务代码 | ||
relation | relation 微服务代码 | ||
user | user 微服务代码 | ||
video | video 微服务代码 | ||
config | 微服务以及第三方包的配置文件 | ||
dal | db | 操作 MySQL 代码 | 包含 Gorm 初始化、Gorm 结构体以及 MySQL 的操作逻辑 |
redis | 操作 Redis 的代码 | 包含 go-redis 初始化、Redis 结构体、Redis 操作逻辑以及 Redis 与MySQL 数据同步的逻辑 | |
dockerfiles | api | API 服务的 DockerFIle 文件 | |
rpc | RPC 服务的 DockerFile 文件 | ||
internal | response | 封装返回的结构体 | |
tool | 封装项目中常用的工具函数 | 包含 RSA、MD5、SHA256 等加密算法以及操作 ffmpeg 对上传视频截图 | |
kitex | 包含 proto 文件以及由 Kitex 生成的 go 代码 | Kitex 生成的 Go 代码在 Kitex_gen 子目录下 | |
pic | 保存一些图片 | ||
pkg | errno | 错误码的实现 | |
etcd | 服务注册与发现 | ||
gocron | 定时任务 | ||
jwt | token生成与校验 | ||
middelware | 常用的中间件 | ||
minio | 对象存储 | ||
rabbitmq | 消息队列 | ||
viper | 配置读取 | ||
zap | 日志打印与日志切割 | ||
scripts | 存放启动脚本 | 包含使用 Docker 启动的 MySQL、Redis、etcd、nginx、rabbitmq、minio 等,以及 MySQL主从复制的配置 |
功能项 | 功能需求 | 测试点 | 模块 | 结果 |
---|---|---|---|---|
基础功能项 | 视频 Feed 流 | 支持所有用户刷抖音,视频按投稿时间倒序推出 | 获取视频列表 | 正确运行 |
视频投稿 | 支持登录用户自己拍视频投稿 | 发布视频 | 正确运行 | |
个人主页 | 支持查看用户基本信息和投稿列表,注册用户流程简化 | 注册 | 正确运行 | |
登录 | 正确运行 | |||
个人信息 | 正确运行 | |||
方向功能项 | 喜欢列表 | 登录用户可以对视频点赞,在个人主页喜欢Tab 下能够查看点赞视频列表 | 获取喜欢列表 | 正确运行 |
点赞 | 正确运行 | |||
取消赞 | 正确运行 | |||
用户评论 | 支持未登录用户查看视频下的评论列表,登录用户能够发表评论 | 获取评论列表 | 正确运行 | |
新增评论 | 正确运行 | |||
删除评论 | 正确运行 | |||
关系列表 | 登录用户可以关注其他用户,能够在个人主页查看本人的关注数和粉丝数,查看关注列表和粉丝列表 | 关注 | 正确运行 | |
取关 | 正确运行 | |||
获取关系列表(关注、粉丝、朋友) | 正确运行 |
403
为中间件限流结果。
用户A
退出与 用户B
聊天界面,并在 Redis
记录未过期之前重新打开与 用户B
的聊天界面,则不会显示聊天记录。如果处理速度跟不上请求速度,导致请求排队,那么在用户退出聊天界面的两秒后不一定能使 用户A
与 用户B
的记录在 Redis 中过期。Redis
键中,记作 Read
和 Write
(键后缀为 r
和 w
):Read
作为高访问率的缓存,设定为定时过期以减轻内存压力;Write
不设置过期,定时将数据同步到数据库中,同步后删除
Redis 中的数据。此处设定将 同步前最后一次修改后的数据 作为同步数据,同步时对 Redis 键进行加锁,同步完成释放锁,若此时还有数据到达,则丢弃数据。{key: token_toUserID, value: create_time}
存储,并设置过期时间为两秒,当用户发送消息时,更新
key 对应的 value 为最新发送消息时间。“消息队列 + 缓存 + 定时同步” 图示
数据库表名 | Golang 类名 | 备注 |
---|---|---|
comment | Comment | 评论 |
messages | Message | 聊天消息 |
relation | FollowRelation (/relation.go) | 社交(粉丝、关注、朋友) |
user | User | 用户 |
video | Video (/feed.go) | 视频 |
user_favorite_videos | FavoriteVideoRelation (/favorite.go) | 视频点赞记录 |
user_favorite_comments | FavoriteCommentRelation (/favorite.go) | 评论点赞记录 |
注:
sh startup.sh
sh shutdown.sh
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。