DouTok目前已转战V2:https://github.com/cloudzenith/DouTok,本仓库不再高强度维护

为什么要开一个V2版本的仓库?

DouTok最初是字节跳动青训营的参赛项目(并取得了比较靠前的名次),在参加青训营的过程中,由于种种原因,导致项目中存在诸多不合理的地方。

例如:DouTok现版本的微服务划分不够合理,拆的过于零碎,也许看起来很“微服务”,但与实际工作生产环境上的服务划分却背道而驰,微服务的划分不应过分追求“微”,而是适应项目发展,在完善基本设计的前提下进行拆分。除此之外,过多的“微服务”导致维护过程中的困难,想要调试就需要启动非常多的服务,对维护过程非常折磨。

在青训营之后,我们开始考虑继续维护DouTok。让DouTok继续扩张的一个卡点是其本身没有前端,只能依赖青训营中提供的“抖声”APP。为了让DouTok顺利扩张,所以我们决定开发一个全新的V2版本。在V2版本中,DouTok减少了服务的划分,增加了前端项目,虽然现阶段依然不够完整,但是已经具备了继续扩张的土壤。

对参与过DouTok维护的所有同学表示感谢!

image-20230223111012814

DouTok is a backend for TikTok client based on Kitex and Hertz.

Hertz Hertz Hertz Hertz Hertz Hertz Hertz Hertz Hertz

Documents

DouTok now have a documents site: https://doutok.zhengfei.xin

Quick Start

  1. Deploy dependencies Deploy some dependencies such as MySQL, Redis etc. Run them by using docker-compose with .yml files in ./deploy or deploy them by yourself.

    docker-compose -f ./deploy/env.yml up -d
    
  2. Update config files

    There's an elegant way to run applications in this repo which is using docker-compose. So update config files in ./config_docker_compose if you use docker-comopse. If you don't want to run them in this way, you must update config files in ./config for ensuring them working.

  3. Run applications by using docker-compose Everything is ready now, ensure that there's a docker-compose.yml in the root directory and run this command in terminal

    docker-compose up -d
    

Download Client

We can download .apk file from ./ui of this repo. Now the client is only support Android. After downloading and installing of this app. We can open it firstly. Then we can click 我 on the right bottom to enter configure page. After opening 高级配置, we can input base url of the backend. An example is http://localhost:8080/.

Architecture

Technology Architecture

image-20230223111253963

Tracing

Visit http://127.0.0.1:16686/ on browser.

image-20230223111410359

Metric

Visit http://127.0.0.1:3000/ on browser.

image-20230223111633341

API Introduce

接口 功能 读/写 特点 备注
/douyin/feed/ 视频流接口 读 根本功能接口 存储优化,缓存优化
/douyin/user/register/ 注册接口 写
/douyin/user/login/ 登陆接口 读
/douyin/user/ 用户信息 读
/douyin/publish/action/ 发布视频 写 存储优化
/douyin/publish/list/ 发布列表 读 缓存优化
/douyin/favorite/action/ 点赞接口 写 操作数大 延迟处理
/douyin/favorite/list/ 点赞列表 读 缓存优化
/douyin/comment/action/ 评论接口 写 操作数大 延迟处理
/douyin/comment/list/ 评论列表 读 缓存优化
/douyin/relation/action/ 关系操作 写 操作数大 延迟处理
/douyin/relation/follow/list/ 关注列表 读 缓存优化
/douyin/relation/follower/list/ 粉丝列表 读 缓存优化
/douyin/relation/friend/list/ 朋友列表 读 缓存优化
/douyin/message/chat/ 聊天记录 读 存储优化,缓存优化
/douyin/message/action/ 消息操作 写 延迟处理

CI/CD

Directories

.
├── applications    // 模块逻辑目录
│   ├── api    // api模块逻辑实现                        
│   │   ├── biz    // api模块主要逻辑实现
│   │   │   ├── handler
│   │   │   │   ├── api
│   │   │   │   ├── pack.go
│   │   │   │   └── ping.go
│   │   │   ├── model
│   │   │   │   └── api
│   │   │   └── router
│   │   │       ├── api
│   │   │       └── register.go
│   │   ├── chat
│   │   ├── initialize
│   │   │   ├── init_hertz.go
│   │   │   ├── jwt.go
│   │   │   ├── redis.go
│   │   │   ├── rpc
│   │   │   └── viper.go
│   │   ├── main.go
│   │   ├── Makefile
│   │   ├── router_gen.go
│   │   └── router.go
│   ├── comment    // comment模块逻辑实现
│   │   ├── build.sh
│   │   ├── dal    // 数据层
│   │   │   ├── gen.go    // gorm/gen生成代码
│   │   │   ├── migrate    // gorm自动迁移
│   │   │   │   └── main.go
│   │   │   ├── model    // model层
│   │   │   └── query    // gorm/gen生成结果
│   │   │       ├── comment_counts.gen.go
│   │   │       ├── comments.gen.go
│   │   │       ├── gen.go
│   │   │       └── var.go
│   │   ├── handler    // RPC服务的接口入口
│   │   ├── main.go    // 模块入口
│   │   ├── Makefile
│   │   ├── misc    // 模块所需的一些简单零散逻辑
│   │   ├── pack    // 将service层提供的数据查询结果包装成接口的返回消息
│   │   ├── rpc    // 初始化调用其他微服务
│   │   ├── script
│   │   ├── service // 数据查询
│   ├── favorite // favorite模块
│   ├── feed    // feed模块
│   ├── message // message模块
│   ├── publish // publish模块
│   ├── relation // relation模块
│   └── user // user模块
├── config    // 项目所需要的配置文件
├── deploy    // 项目所需的环境部署
├── documents    // 相关文档
├── go.mod
├── go.sum
├── kitex_gen    // Kitex生成的代码
│   ├── comment
│   ├── favorite
│   ├── feed
│   ├── message
│   ├── publish
│   ├── relation
│   └── user
├── pkg    // 项目所依赖的一些公共包
│   ├── constants    // 常量包
│   ├── dlog    // 日志包
│   ├── dtviper    // 配置包
│   ├── errno    // 错误码包
│   ├── hbaseHandle    // HBase操作包
│   ├── initHelper    // 初始化服务助手
│   ├── kafka    // Kafka操作包
│   ├── middleware    // 中间件
│   ├── misc    // 一些零散逻辑
│   ├── mock    // Mock测试包
│   │   ├── comment
│   │   ├── favorite
│   │   ├── feed
│   │   ├── message
│   │   ├── publish
│   │   ├── relation
│   │   └── user
│   ├── mysqlIniter    // MySQL操作包
│   ├── ossHandle    // OSS操作包
│   ├── redisHandle    // Redis操作包
│   ├── safeMap    // 线程安全的Map
│   └── utils    // 其他组件
├── proto    // 基于Protobuf3完成的IDL
├── README.md
└── scripts