基于 kitex RPC微服务 + Hertz HTTP服务完成的第三届字节跳动青训营-极简抖音后端项目
-
采用RPC框架(Kitex)脚手架生成代码进行开发,基于 RPC 微服务 + Hertz 提供 HTTP 服务
-
基于《接口文档在线分享- Apifox》提供的接口进行开发,使用《极简抖音App使用说明 - 青训营版 》提供的APK进行Demo测试, 功能完整实现 ,前端接口匹配良好。
-
代码结构采用 (HTTP API 层 + RPC Service 层+Dal 层) 项目 结构清晰 ,代码 符合规范
-
使用 JWT 进行用户token的校验
-
使用 ETCD 进行服务发现和服务注册;
-
使用 Minio 实现视频文件和图片的对象存储
-
使用 Gorm 对 MySQL 进行 ORM 操作;
-
使用 OpenTelemetry 实现链路跟踪;
-
数据库表建立了索引和外键约束,对于具有关联性的操作一旦出错立刻回滚,保证数据一致性和安全性
服务名称 | 模块介绍 | 技术框架 | 传输协议 | 注册中心 | 链路跟踪 | 数据存储 | 日志 | 配置存取 |
---|---|---|---|---|---|---|---|---|
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 |
-
HTTP 使用 Hertz 开放 HTTP 端口, 通过封装的RPC客户端与微服务中的服务端通信;
-
RPC 微服务, 接收客户端的请求, 在各自的 command 中实现与数据库交互的业务逻辑;
-
DAL 提供数据层实现, pack 部分实现将数据库输出封装为服务端的响应结构体;
-
MiddleWare 提供中间件业务逻辑代码实现.
目录 | 子目录 | 说明 | 备注 |
---|---|---|---|
cmd | api | api 服务的 业务代码 | 包含 Hertz和 RPC_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 配置存取初始化及代码封装 |
-
提前修改 config目录的相关配置
-
运行基础依赖
# 自行安装 docker 及 docker-compose docker-compose up -d
-
运行 user 服务
cd cmd/user sh build.sh sh output/bootstrap.sh
-
运行 comment 服务
cd cmd/comment sh build.sh sh output/bootstrap.sh
-
运行 favorite 服务
cd cmd/favorite sh build.sh sh output/bootstrap.sh
-
运行 feed 服务
cd cmd/feed sh build.sh sh output/bootstrap.sh
-
运行 publish 服务
cd cmd/publish sh build.sh sh output/bootstrap.sh
-
运行 relation 服务
cd cmd/relation sh build.sh sh output/bootstrap.sh
-
运行 api 服务
cd cmd/api chmod +x ./run.sh sh ./run.sh
注册接口 | 登录接口 | 获取用户信息接口 |
---|---|---|
获取视频流接口 |
---|
投稿视频接口 | 获取用户发布视频列表接口 |
---|---|
评论操作接口 | 获取视频评论列表接口 |
---|---|
点赞操作接口 | 获取用户点赞列表接口 |
---|---|
关注操作接口 | 获取关注列表接口 |
---|---|
-
actiontype语义化
-
优化一下存储,使用redis缓存
-
minio不要对外暴露9001端口,容易被攻击
-
pack逻辑存在for循环查询数据库,pack只用于数据打包,不应该出现查库逻辑
-
DAL 层优化
for
循环内的 db 查询 -
使用 Jaeger 实现链路跟踪可视化
-
添加 RPC微服务 Handler 部分的单元测试内容
-
编写 DockerFile 实现分布式容器部署
-
采用 Redis 作为 NoSQL 缓存,优化 JWT 鉴权,结合消息队列和 Redis 实现对定时更新 Token、各种操作数据 的缓存和持久性存储
-
实现分库分表