抖音项目文档 | 青训营笔记

306 阅读3分钟

这是我参与「第三届青训营 - 后端场」笔记创作活动的第5篇笔记

一、项目特点

  1. 采用RPC框架(Kitex)脚手架生成代码进行开发,基于 RPC 微服务 + Gin 提供 HTTP 服务

  2. 基于《接口文档在线分享- Apifox》提供的接口进行开发,使用《极简抖音App使用说明 - 青训营版 》提供的APK进行Demo测试, 功能完整实现 ,前端接口匹配良好。

  3. 代码结构采用 (HTTP API 层 + RPC Service 层+Dal 层) 项目 结构清晰 ,代码 符合规范

  4. 使用 JWT 进行用户token的校验

  5. 使用 ETCD 进行服务发现和服务注册;

  6. 使用 Minio 实现视频文件和图片的对象存储

  7. 使用 Gorm 对 MySQL 进行 ORM 操作;

  8. 使用 OpenTelemetry 实现链路跟踪;

  9. 数据库表建立了索引和外键约束,对于具有关联性的操作一旦出错立刻回滚,保证数据一致性和安全性

二、项目地址

三、项目说明

1. 项目模块介绍

服务名称模块介绍技术框架传输协议注册中心链路跟踪数据存储日志配置存取
apiAPI服务将HTTP请求发送给RPC微服务端Gorm Kitex Ginhttpetcdopentelemetry下一步计划采用Rediszapklogviper
user用户管理微服务Gorm Kitex Gin JWTproto3MySQL gorm
relation用户关注微服务
feed视频流微服务
favorite用户点赞微服务
comment用户评论微服务
publish视频发布微服务MySQL gorm minio对象存储
dal用户管理微服务MySQL gorm-MySQL gorm

2. 服务调用关系

image.png

3. 数据库 ER 图

image.png

4. 代码介绍

4.1 代码目录结构介绍

目录子目录说明备注
cmdapiapi 服务的 业务代码包含 GinRPC_client
commentcommand 服务的业务代码
favoritefavorite 服务的业务代码
feedfeed 服务的业务代码
publishpublish 服务的业务代码
relationrelation 服务的业务代码
useruser 服务的业务代码
config微服务及 pkg 的 配置文件
daldb包含 Gorm 初始化Gorm 结构体及 数据库操作逻辑
packGorm 结构体 封装为 protobuf 结构体业务逻辑Protobuf 结构体由 Kitex自动生成
idlproto 接口定义文件
kitex_genKitex 自动生成的代码
pkgdlog基于 klog 和 zap 封装的 Logger 及其接口
errno错误码错误码设计逻辑:GitHub - a76yyyy/ErrnoCode: 适配于 github.com/a76yyyy/errors 错误包的错误码实现
jwt基于 golang-jwt的代码封装
middlewareKitex的中间件
minioMinio 对象存储初始化及代码封装
ttviperViper 配置存取初始化及代码封装

4.2 代码运行

  1. 提前修改 config目录的相关配置

  2. 运行基础依赖

    # 自行安装 docker 及 docker-compose
    docker-compose up -d |
    
  3. 运行 user 服务

    cd cmd/user
    sh build.sh
    sh output/bootstrap.sh |
    
  4. 运行 comment 服务

    cd cmd/comment
    sh build.sh
    sh output/bootstrap.sh |
    
  5. 运行 favorite 服务

    cd cmd/favorite
    sh build.sh
    sh output/bootstrap.sh |
    
  6. 运行 feed 服务

    cd cmd/feed
    sh build.sh
    sh output/bootstrap.sh |
    
  7. 运行 publish 服务

    cd cmd/publish
    sh build.sh
    sh output/bootstrap.sh |
    
  8. 运行 relation 服务

    cd cmd/relation
    sh build.sh
    sh output/bootstrap.sh |
    
  9. 运行 api 服务

    cd cmd/api
    chmod +x ./run.sh
    sh ./run.sh |
    

四. 下一步计划

  1. 目前已采用 FFmpeg-go 获取到了视频的封面图片流,但是保存为图片后显示解码错误,等待调试解决

  2. 编写 DockerFile 实现分布式容器部署

  3. 检查 自封装的 dlog 包中 callerSkip存在的问题

  4. 采用 Redis 作为 NoSQL 缓存,优化 JWT 鉴权,结合消息队列和 Redis 实现对定时更新 Token、各种操作数据 的缓存和持久性存储

  5. 使用 Jaeger 实现链路跟踪可视化