基于 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、各种操作数据 的缓存和持久性存储
实现分库分表