该项目为字节跳动青训营项目,实现了抖音主要功能模块,包括视频、用户、点赞、评论、关注、消息等服务,从单体架构升级到微服务架构,并持续优化相关技术实现。
接口文档: Apifox | 项目演示地址:http://chuxin0816.com:8888/ (已关闭)
docker-compose up -d
. #篇幅有限,只展示主要部分
├── cmd
│ ├── docker Dockerfile
│ └── gen Gorm/Gen
├── etc 配置文件
├── src
│ ├── config
│ ├── dal 访问数据库(MySQL, Redis, MongoDB, NebulaGraph)
│ ├── idl
│ ├── kitex_gen
│ ├── logger 日志及其配置
│ ├── pkg
│ │ ├── jwt JWT认证
│ │ ├── kafka Kafka消息队列
│ │ ├── oss 阿里云OSS
│ │ ├── snowflake 雪花算法
│ │ └── tracing 链路追踪
│ └── service
│ ├── api HTTP服务端
│ ├── comment 评论服务
│ ├── favorite 点赞服务
│ ├── message 消息服务
│ ├── relation 关注服务
│ ├── user 用户服务
│ └── video 视频服务
└── docker-compose.yml
使用wrk进行性能测试,400个连接,16个线程,压力测试30s:读接口QPS 3500+,写接口QPS 2800+,压测过程全链路无错误
- 框架选型:使用 Hertz 作为 HTTP 微服务框架,Kitex 作为 RPC 微服务框架;使用 GORM GEN 生成代码并操作 MySQL 数据库
- 数据库:使用 MySQL 和 Redis 集群实现读写分离,使用 MongoDB 存储用户消息,使用 NebulaGraph 存储用户关系
- 服务注册与发现:使用 Consul 作为服务发现与注册中心和配置中心,并通过 viper 实时监控和读取配置文件
- 缓存策略:通过 Cache Aside + Write Behind 等多种策略提升数据访问速度。使用 SingleFlight 减轻数据库压力并防止缓存击穿、使用布隆过滤器减少缓存穿透,并通过随机延时策略避免缓存雪崩
- 中间件:采用令牌桶作为限流中间件,JWT 作为用户认证中间件,使用 Kafka 作为消息队列,实现异步写入数据库、配合 Canal 删除缓存、同步布隆过滤器等操作
- 云原生:通过 OpenTelemetry + Jaeger 实现分布式链路追踪,使用 Docker Compose 一键部署项目,并通过 GitHub Actions 自动构建和推送镜像
- 其他:使用 Snowflake 算法生成全局唯一ID,使用 ffmpeg 截取视频第5帧作为封面,使用 OSS 存储视频和视频封面
1. Gorm/Gen代码生成
go run cmd/gen/generator.go
2. Kitex代码生成
cd src/service/feed
kitex -module douyin -service user -gen-path ../../kitex_gen/ ../../idl/user.thrift
- 使用ElasticSearch对用户消息和系统日志进行索引存储
- 使用Prometheus和Grafana监控服务
- 使用Kubernetes编排容器