/tiktok

基于 kitex RPC微服务 + Hertz HTTP服务完成的第三届字节跳动青训营-极简抖音后端项目

Primary LanguageGoApache License 2.0Apache-2.0

tiktok

基于 kitex RPC微服务 + Hertz HTTP服务完成的第三届字节跳动青训营-极简抖音后端项目

一、项目特点

  1. 采用RPC框架(Kitex)脚手架生成代码进行开发,基于 RPC 微服务 + Hertz 提供 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. 项目模块介绍

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

2. 服务调用关系

image.png

  • HTTP 使用 Hertz 开放 HTTP 端口, 通过封装的RPC客户端与微服务中的服务端通信;

  • RPC 微服务, 接收客户端的请求, 在各自的 command 中实现与数据库交互的业务逻辑;

  • DAL 提供数据层实现, pack 部分实现将数据库输出封装为服务端的响应结构体;

  • MiddleWare 提供中间件业务逻辑代码实现.

3. 数据库 ER 图

image.png

4. 代码介绍

4.1 代码目录结构介绍

目录 子目录 说明 备注
cmd api api 服务的 业务代码 包含 HertzRPC_client
comment command 服务的业务代码
favorite favorite 服务的业务代码
feed feed 服务的业务代码
publish publish 服务的业务代码
relation relation 服务的业务代码
user user 服务的业务代码
config 微服务及 pkg 的 配置文件
dal db 包含 Gorm 初始化Gorm 结构体及 数据库操作逻辑
pack Gorm 结构体 封装为 protobuf 结构体业务逻辑 Protobuf 结构体由 Kitex自动生成
idl proto 接口定义文件
kitex_gen Kitex 自动生成的代码
pkg dlog 基于 klog 和 zap 封装的 Logger 及其接口
errno 错误码 错误码设计逻辑:a76yyyy/ErrnoCod
jwt 基于 golang-jwt的代码封装
middleware Kitex的中间件
minio Minio 对象存储初始化及代码封装
ttviper Viper 配置存取初始化及代码封装

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 

四、项目接口介绍

User 微服务

注册接口 登录接口 获取用户信息接口
注册接口.png 登录接口.png 获取用户信息接口.png

Feed 微服务

获取视频流接口
获取视频流接口.png

Publish 微服务

投稿视频接口 获取用户发布视频列表接口
投稿视频接口.png 获取用户发布视频列表接口.png

Comment 微服务

评论操作接口 获取视频评论列表接口
评论操作接口.png 获取视频评论列表接口.png

Favorite 微服务

点赞操作接口 获取用户点赞列表接口
点赞操作接口.png 获取用户点赞列表接口.png

Relation 微服务

关注操作接口 获取关注列表接口
关注操作接口.png 获取关注列表接口.png

五、存在问题

  1. actiontype语义化

  2. 优化一下存储,使用redis缓存

  3. minio不要对外暴露9001端口,容易被攻击

  4. pack逻辑存在for循环查询数据库,pack只用于数据打包,不应该出现查库逻辑

六、下一步计划

  1. DAL 层优化 for 循环内的 db 查询

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

  3. 添加 RPC微服务 Handler 部分的单元测试内容

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

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

  6. 实现分库分表